diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6a6caac..29518e1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-# 
+#
 
 # Copyright (c) 2012-2017 The Khronos Group Inc.
 #
@@ -51,6 +51,35 @@
 option( OPENVX_USE_IX ON )
 option( OPENVX_USE_NN ON )
 option( OPENVX_USE_NN_16 ON )
+option( OPENVX_USE_PIPELINING OFF )
+option( OPENVX_USE_STREAMING OFF )
+option( OPENVX_USE_USER_DATA_OBJECT OFF )
+option( OPENVX_USE_U1 ON )
+option( OPENVX_CONFORMANCE_VISION ON )
+option( OPENVX_CONFORMANCE_NEURAL_NETWORKS ON )
+option( OPENVX_CONFORMANCE_NNEF_IMPORT ON)
+option( OPENVX_USE_ENHANCED_VISION ON )
+
+
+message( "-- Selected OpenVX Feature Sets:")
+if (OPENVX_CONFORMANCE_VISION)
+    add_definitions( -DOPENVX_CONFORMANCE_VISION )
+    message( "-- 'Vision' conformance feature set")
+endif (OPENVX_CONFORMANCE_VISION)
+if (OPENVX_CONFORMANCE_NEURAL_NETWORKS)
+    add_definitions( -DOPENVX_CONFORMANCE_NEURAL_NETWORKS -DOPENVX_USE_NN )
+    message( "-- 'Neural Networks' conformance feature set")
+endif (OPENVX_CONFORMANCE_NEURAL_NETWORKS)
+if (OPENVX_CONFORMANCE_NNEF_IMPORT)
+    add_definitions( -DOPENVX_CONFORMANCE_NNEF_IMPORT )
+    message( "-- 'NNEF Import' conformance feature set")
+endif (OPENVX_CONFORMANCE_NNEF_IMPORT)
+if (OPENVX_USE_ENHANCED_VISION)
+    add_definitions( -DOPENVX_USE_ENHANCED_VISION )
+    message( "-- 'Enhanced Vision' feature set")
+endif (OPENVX_USE_ENHANCED_VISION)
+message( "--" )
+
 
 message( "-- Selected OpenVX Extensions:")
 if (OPENVX_USE_IX)
@@ -58,13 +87,29 @@
     message( "--    Offical Import-Export extension")
 endif (OPENVX_USE_IX)
 if (OPENVX_USE_NN)
-    add_definitions( -DOPENVX_USE_NN )
+    add_definitions( -DOPENVX_USE_NN -DOPENVX_CONFORMANCE_NEURAL_NETWORKS )
     message( "--    Offical NeuralNet extension")
 endif (OPENVX_USE_NN)
 if (OPENVX_USE_NN_16)
     add_definitions( -DOPENVX_USE_NN_16 )
     message( "--    Offical NeuralNet 16 bits extension")
 endif (OPENVX_USE_NN_16)
+if (OPENVX_USE_PIPELINING)
+    add_definitions( -DOPENVX_USE_PIPELINING )
+    message( "--    Offical Pipelining extension")
+endif (OPENVX_USE_PIPELINING)
+if (OPENVX_USE_STREAMING)
+    add_definitions( -DOPENVX_USE_STREAMING )
+    message( "--    Offical Streaming extension")
+endif (OPENVX_USE_STREAMING)
+if (OPENVX_USE_USER_DATA_OBJECT)
+    add_definitions( -DOPENVX_USE_USER_DATA_OBJECT )
+    message( "--    Offical User Data Object extension")
+endif (OPENVX_USE_USER_DATA_OBJECT)
+if (OPENVX_USE_U1)
+    add_definitions( -DOPENVX_USE_U1 )
+    message( "--    Offical binary (1 bit) feature set")
+endif (OPENVX_USE_U1)
 message( "--" )
 
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
diff --git a/README b/README
index 63d110b..c89cc9d 100644
--- a/README
+++ b/README
@@ -13,6 +13,8 @@
 
 * OPENVX_USE_NN      - Compile neural network test case or not.
 
+* OPENVX_USE_U1      - Compile binary image test cases or not.
+
 * OPENVX_LIBRARIES   - semicolon separated list of shared/static libraries to link
                        with. If there are link order dependencies between your
                        libraries, then the libraries have to be specified in
@@ -41,8 +43,8 @@
     cmake --build .
 
 
-Use the following commands to build the test suite with import-export and
-neural network KHR extensions activated:
+Use the following commands to build the test suite with import-export, neural
+network and binary image KHR extensions activated:
 
     export OPENVX_DIR=<path to prebuilt OpenVX>
     cd <build dir>
@@ -51,6 +53,7 @@
         -DOPENVX_LIBRARIES=$OPENVX_DIR/lib/libopenvx.so\;$OPENVX_DIR/lib/libvxu.so\;pthread\;dl\;m\;rt \
         -DOPENVX_USE_IX=ON \
         -DOPENVX_USE_NN=ON \
+        -DOPENVX_USE_U1=ON \
         ../conformance_tests/
     cmake --build .
 
diff --git a/openvx_cts_version.inc b/openvx_cts_version.inc
index 9eeb118..ced3a22 100644
--- a/openvx_cts_version.inc
+++ b/openvx_cts_version.inc
@@ -1,2 +1,2 @@
 // <Specification version>-<package release date:YYYYMMDD>
-#define VERSION_STR "1.2"
+#define VERSION_STR "1.3"
diff --git a/test_conformance/Networks/src/graph_alexnet.c b/test_conformance/Networks/src/graph_alexnet.c
index 870a0c8..92eb3ff 100644
--- a/test_conformance/Networks/src/graph_alexnet.c
+++ b/test_conformance/Networks/src/graph_alexnet.c
@@ -1,13 +1,14 @@
 /** @file graph.h
- *  @brief 
+ *  @brief
  *  This file contains the implementation of the generated graph factory function
  */
 
-#ifdef OPENVX_USE_NN
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <VX/vx_khr_nn.h>
+#include <VX/vx_compatibility.h>  // for vxNormalizeLayer
 #include "graph.h"
 
 
@@ -171,19 +172,12 @@
 
 static vx_status Graph(vx_context context, vx_graph graph, ObjectRefContainerType* pObjectContainer, char* filteredNodeList[], size_t filteredNodeCount, vx_tensor org_khronos_nn_extension_convolution_layer_0_p0, vx_tensor org_khronos_nn_extension_convolution_layer_0_p1, vx_tensor org_khronos_nn_extension_convolution_layer_0_p2, vx_scalar org_khronos_nn_extension_convolution_layer_0_p3, vx_scalar org_khronos_nn_extension_convolution_layer_0_p4, vx_scalar org_khronos_nn_extension_convolution_layer_0_p5, vx_scalar org_khronos_nn_extension_convolution_layer_0_p6, vx_scalar org_khronos_nn_extension_convolution_layer_0_p7, vx_tensor org_khronos_nn_extension_convolution_layer_0_p8)
 {
-    vx_status status = VX_SUCCESS;    
+    vx_status status = VX_SUCCESS;
 
     //
     // Kernel Declarations
     //
 
-    vx_kernel org_khronos_nn_extension_convolution_layer_Kernel;
-    vx_kernel org_khronos_nn_extension_activation_layer_Kernel;
-    vx_kernel org_khronos_nn_extension_normalization_layer_Kernel;
-    vx_kernel org_khronos_nn_extension_pooling_layer_Kernel;
-    vx_kernel org_khronos_nn_extension_fully_connected_layer_Kernel;
-    vx_kernel com_cnn_helpers_scalemddata_Kernel;
-    vx_kernel org_khronos_nn_extension_softmax_layer_Kernel;
 
     //
     // Node Declarations
@@ -212,7 +206,6 @@
     vx_node org_khronos_nn_extension_fully_connected_layer_1;
     vx_node org_khronos_nn_extension_activation_layer_6;
     vx_node org_khronos_nn_extension_fully_connected_layer_2;
-    vx_node com_cnn_helpers_scalemddata_0;
     vx_node org_khronos_nn_extension_softmax_layer_0;
 
     //
@@ -557,7 +550,7 @@
     // Primitive Assignments
     //
     outputAllocators_MergeTensor_2_p0 = vxCreateTensor(context, 4, outputAllocators_MergeTensor_2_p0Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)outputAllocators_MergeTensor_2_p0);
     if(status != VX_SUCCESS)
     {
@@ -567,7 +560,7 @@
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_MergeTensor_2_p0, VX_TYPE_TENSOR, "relu5_0");
 
     outputAllocators_MergeTensor_1_p0 = vxCreateTensor(context, 4, outputAllocators_MergeTensor_1_p0Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)outputAllocators_MergeTensor_1_p0);
     if(status != VX_SUCCESS)
     {
@@ -577,7 +570,7 @@
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_MergeTensor_1_p0, VX_TYPE_TENSOR, "relu4_0");
 
     outputAllocators_MergeTensor_0_p0 = vxCreateTensor(context, 4, outputAllocators_MergeTensor_0_p0Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)outputAllocators_MergeTensor_0_p0);
     if(status != VX_SUCCESS)
     {
@@ -586,7 +579,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_MergeTensor_0_p0, VX_TYPE_TENSOR, "relu2_0");
 
-    org_khronos_nn_extension_activation_layer_0_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_0_scalar_p1);    
+    org_khronos_nn_extension_activation_layer_0_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_0_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_0_p1);
     if(status != VX_SUCCESS)
     {
@@ -595,7 +588,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_0_p1, VX_TYPE_SCALAR, "relu1_1");
 
-    org_khronos_nn_extension_activation_layer_0_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_0_scalar_p2);    
+    org_khronos_nn_extension_activation_layer_0_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_0_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_0_p2);
     if(status != VX_SUCCESS)
     {
@@ -604,7 +597,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_0_p2, VX_TYPE_SCALAR, "relu1_2");
 
-    org_khronos_nn_extension_activation_layer_0_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_0_scalar_p3);    
+    org_khronos_nn_extension_activation_layer_0_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_0_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_0_p3);
     if(status != VX_SUCCESS)
     {
@@ -614,7 +607,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_0_p3, VX_TYPE_SCALAR, "relu1_2");
 
     org_khronos_nn_extension_activation_layer_0_p4 = vxCreateTensor(context, 4, org_khronos_nn_extension_activation_layer_0_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_0_p4);
     if(status != VX_SUCCESS)
     {
@@ -623,7 +616,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_0_p4, VX_TYPE_TENSOR, "relu1_4");
 
-    org_khronos_nn_extension_normalization_layer_0_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p1);    
+    org_khronos_nn_extension_normalization_layer_0_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_0_p1);
     if(status != VX_SUCCESS)
     {
@@ -632,7 +625,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p1, VX_TYPE_SCALAR, "norm1_1");
 
-    org_khronos_nn_extension_normalization_layer_0_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p2);    
+    org_khronos_nn_extension_normalization_layer_0_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_0_p2);
     if(status != VX_SUCCESS)
     {
@@ -641,7 +634,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p2, VX_TYPE_SCALAR, "norm1_2");
 
-    org_khronos_nn_extension_normalization_layer_0_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p3);    
+    org_khronos_nn_extension_normalization_layer_0_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_0_p3);
     if(status != VX_SUCCESS)
     {
@@ -650,7 +643,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p3, VX_TYPE_SCALAR, "norm1_3");
 
-    org_khronos_nn_extension_normalization_layer_0_p4 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p4);    
+    org_khronos_nn_extension_normalization_layer_0_p4 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_0_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_0_p4);
     if(status != VX_SUCCESS)
     {
@@ -660,7 +653,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p4, VX_TYPE_SCALAR, "norm1_4");
 
     org_khronos_nn_extension_normalization_layer_0_p5 = vxCreateTensor(context, 4, org_khronos_nn_extension_normalization_layer_0_p5Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_0_p5);
     if(status != VX_SUCCESS)
     {
@@ -669,7 +662,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p5, VX_TYPE_TENSOR, "norm1_5");
 
-    org_khronos_nn_extension_pooling_layer_0_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p1);    
+    org_khronos_nn_extension_pooling_layer_0_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_0_p1);
     if(status != VX_SUCCESS)
     {
@@ -678,7 +671,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p1, VX_TYPE_SCALAR, "pool1_1");
 
-    org_khronos_nn_extension_pooling_layer_0_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p2);    
+    org_khronos_nn_extension_pooling_layer_0_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_0_p2);
     if(status != VX_SUCCESS)
     {
@@ -687,7 +680,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p2, VX_TYPE_SCALAR, "pool1_2");
 
-    org_khronos_nn_extension_pooling_layer_0_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p3);    
+    org_khronos_nn_extension_pooling_layer_0_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_0_p3);
     if(status != VX_SUCCESS)
     {
@@ -696,7 +689,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p3, VX_TYPE_SCALAR, "pool1_3");
 
-    org_khronos_nn_extension_pooling_layer_0_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p4);    
+    org_khronos_nn_extension_pooling_layer_0_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_0_p4);
     if(status != VX_SUCCESS)
     {
@@ -705,7 +698,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p4, VX_TYPE_SCALAR, "pool1_4");
 
-    org_khronos_nn_extension_pooling_layer_0_p5 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p5);    
+    org_khronos_nn_extension_pooling_layer_0_p5 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_0_p5);
     if(status != VX_SUCCESS)
     {
@@ -714,7 +707,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p5, VX_TYPE_SCALAR, "pool1_5");
 
-    org_khronos_nn_extension_pooling_layer_0_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p6);    
+    org_khronos_nn_extension_pooling_layer_0_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_0_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_0_p6);
     if(status != VX_SUCCESS)
     {
@@ -724,7 +717,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p6, VX_TYPE_SCALAR, "pool1_6");
 
     org_khronos_nn_extension_pooling_layer_0_p7 = vxCreateTensor(context, 4, org_khronos_nn_extension_pooling_layer_0_p7Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_0_p7);
     if(status != VX_SUCCESS)
     {
@@ -733,7 +726,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p7, VX_TYPE_TENSOR, "pool1_7");
 
-    outputAllocators_SplitTensor_0_p1 = vxCreateTensorFromView(org_khronos_nn_extension_pooling_layer_0_p7, 4, org_khronos_nn_extension_pooling_layer_0_p7_view1_view_start, org_khronos_nn_extension_pooling_layer_0_p7_view1_view_end);    
+    outputAllocators_SplitTensor_0_p1 = vxCreateTensorFromView(org_khronos_nn_extension_pooling_layer_0_p7, 4, org_khronos_nn_extension_pooling_layer_0_p7_view1_view_start, org_khronos_nn_extension_pooling_layer_0_p7_view1_view_end);
     status = vxGetStatus((vx_reference)outputAllocators_SplitTensor_0_p1);
     if(status != VX_SUCCESS)
     {
@@ -742,7 +735,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_SplitTensor_0_p1, VX_TYPE_TENSOR, "conv2_0_0");
 
-    outputAllocators_SplitTensor_0_p2 = vxCreateTensorFromView(org_khronos_nn_extension_pooling_layer_0_p7, 4, org_khronos_nn_extension_pooling_layer_0_p7_view2_view_start, org_khronos_nn_extension_pooling_layer_0_p7_view2_view_end);    
+    outputAllocators_SplitTensor_0_p2 = vxCreateTensorFromView(org_khronos_nn_extension_pooling_layer_0_p7, 4, org_khronos_nn_extension_pooling_layer_0_p7_view2_view_start, org_khronos_nn_extension_pooling_layer_0_p7_view2_view_end);
     status = vxGetStatus((vx_reference)outputAllocators_SplitTensor_0_p2);
     if(status != VX_SUCCESS)
     {
@@ -752,7 +745,7 @@
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_SplitTensor_0_p2, VX_TYPE_TENSOR, "conv2_1_0");
 
     org_khronos_nn_extension_convolution_layer_2_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_2_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p1);
     if(status != VX_SUCCESS)
     {
@@ -762,7 +755,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p1, VX_TYPE_TENSOR, "conv2_0_weights");
 
     org_khronos_nn_extension_convolution_layer_2_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_2_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p2);
     if(status != VX_SUCCESS)
     {
@@ -771,7 +764,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p2, VX_TYPE_TENSOR, "conv2_0_bias");
 
-    org_khronos_nn_extension_convolution_layer_2_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p3);    
+    org_khronos_nn_extension_convolution_layer_2_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p3);
     if(status != VX_SUCCESS)
     {
@@ -780,7 +773,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p3, VX_TYPE_SCALAR, "conv2_0_3");
 
-    org_khronos_nn_extension_convolution_layer_2_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p4);    
+    org_khronos_nn_extension_convolution_layer_2_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p4);
     if(status != VX_SUCCESS)
     {
@@ -789,7 +782,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p4, VX_TYPE_SCALAR, "conv2_0_4");
 
-    org_khronos_nn_extension_convolution_layer_2_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p5);    
+    org_khronos_nn_extension_convolution_layer_2_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p5);
     if(status != VX_SUCCESS)
     {
@@ -798,7 +791,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p5, VX_TYPE_SCALAR, "conv2_0_5");
 
-    org_khronos_nn_extension_convolution_layer_2_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p6);    
+    org_khronos_nn_extension_convolution_layer_2_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p6);
     if(status != VX_SUCCESS)
     {
@@ -807,7 +800,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p6, VX_TYPE_SCALAR, "conv2_0_6");
 
-    org_khronos_nn_extension_convolution_layer_2_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p7);    
+    org_khronos_nn_extension_convolution_layer_2_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_2_scalar_p7);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p7);
     if(status != VX_SUCCESS)
     {
@@ -816,7 +809,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p7, VX_TYPE_SCALAR, "conv2_0_7");
 
-    org_khronos_nn_extension_convolution_layer_2_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_0_p0, 4, org_khronos_nn_extension_convolution_layer_2_p8_view_view_start, org_khronos_nn_extension_convolution_layer_2_p8_view_view_end);    
+    org_khronos_nn_extension_convolution_layer_2_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_0_p0, 4, org_khronos_nn_extension_convolution_layer_2_p8_view_view_start, org_khronos_nn_extension_convolution_layer_2_p8_view_view_end);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_2_p8);
     if(status != VX_SUCCESS)
     {
@@ -826,7 +819,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p8, VX_TYPE_TENSOR, "conv2_0_8");
 
     org_khronos_nn_extension_convolution_layer_1_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_1_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p1);
     if(status != VX_SUCCESS)
     {
@@ -836,7 +829,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p1, VX_TYPE_TENSOR, "conv2_1_weights");
 
     org_khronos_nn_extension_convolution_layer_1_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_1_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p2);
     if(status != VX_SUCCESS)
     {
@@ -845,7 +838,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p2, VX_TYPE_TENSOR, "conv2_1_bias");
 
-    org_khronos_nn_extension_convolution_layer_1_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p3);    
+    org_khronos_nn_extension_convolution_layer_1_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p3);
     if(status != VX_SUCCESS)
     {
@@ -854,7 +847,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p3, VX_TYPE_SCALAR, "conv2_1_3");
 
-    org_khronos_nn_extension_convolution_layer_1_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p4);    
+    org_khronos_nn_extension_convolution_layer_1_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p4);
     if(status != VX_SUCCESS)
     {
@@ -863,7 +856,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p4, VX_TYPE_SCALAR, "conv2_1_4");
 
-    org_khronos_nn_extension_convolution_layer_1_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p5);    
+    org_khronos_nn_extension_convolution_layer_1_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p5);
     if(status != VX_SUCCESS)
     {
@@ -872,7 +865,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p5, VX_TYPE_SCALAR, "conv2_1_5");
 
-    org_khronos_nn_extension_convolution_layer_1_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p6);    
+    org_khronos_nn_extension_convolution_layer_1_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p6);
     if(status != VX_SUCCESS)
     {
@@ -881,7 +874,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p6, VX_TYPE_SCALAR, "conv2_1_6");
 
-    org_khronos_nn_extension_convolution_layer_1_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p7);    
+    org_khronos_nn_extension_convolution_layer_1_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_1_scalar_p7);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p7);
     if(status != VX_SUCCESS)
     {
@@ -890,7 +883,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p7, VX_TYPE_SCALAR, "conv2_1_7");
 
-    org_khronos_nn_extension_convolution_layer_1_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_0_p0, 4, org_khronos_nn_extension_convolution_layer_1_p8_view_view_start, org_khronos_nn_extension_convolution_layer_1_p8_view_view_end);    
+    org_khronos_nn_extension_convolution_layer_1_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_0_p0, 4, org_khronos_nn_extension_convolution_layer_1_p8_view_view_start, org_khronos_nn_extension_convolution_layer_1_p8_view_view_end);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_1_p8);
     if(status != VX_SUCCESS)
     {
@@ -899,7 +892,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p8, VX_TYPE_TENSOR, "conv2_1_8");
 
-    org_khronos_nn_extension_activation_layer_1_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_1_scalar_p1);    
+    org_khronos_nn_extension_activation_layer_1_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_1_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_1_p1);
     if(status != VX_SUCCESS)
     {
@@ -908,7 +901,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_1_p1, VX_TYPE_SCALAR, "relu2_1");
 
-    org_khronos_nn_extension_activation_layer_1_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_1_scalar_p2);    
+    org_khronos_nn_extension_activation_layer_1_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_1_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_1_p2);
     if(status != VX_SUCCESS)
     {
@@ -917,7 +910,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_1_p2, VX_TYPE_SCALAR, "relu2_2");
 
-    org_khronos_nn_extension_activation_layer_1_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_1_scalar_p3);    
+    org_khronos_nn_extension_activation_layer_1_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_1_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_1_p3);
     if(status != VX_SUCCESS)
     {
@@ -927,7 +920,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_1_p3, VX_TYPE_SCALAR, "relu2_2");
 
     org_khronos_nn_extension_activation_layer_1_p4 = vxCreateTensor(context, 4, org_khronos_nn_extension_activation_layer_1_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_1_p4);
     if(status != VX_SUCCESS)
     {
@@ -936,7 +929,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_1_p4, VX_TYPE_TENSOR, "relu2_4");
 
-    org_khronos_nn_extension_normalization_layer_1_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p1);    
+    org_khronos_nn_extension_normalization_layer_1_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_1_p1);
     if(status != VX_SUCCESS)
     {
@@ -945,7 +938,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p1, VX_TYPE_SCALAR, "norm2_1");
 
-    org_khronos_nn_extension_normalization_layer_1_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p2);    
+    org_khronos_nn_extension_normalization_layer_1_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_1_p2);
     if(status != VX_SUCCESS)
     {
@@ -954,7 +947,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p2, VX_TYPE_SCALAR, "norm2_2");
 
-    org_khronos_nn_extension_normalization_layer_1_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p3);    
+    org_khronos_nn_extension_normalization_layer_1_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_1_p3);
     if(status != VX_SUCCESS)
     {
@@ -963,7 +956,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p3, VX_TYPE_SCALAR, "norm2_3");
 
-    org_khronos_nn_extension_normalization_layer_1_p4 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p4);    
+    org_khronos_nn_extension_normalization_layer_1_p4 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_normalization_layer_1_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_1_p4);
     if(status != VX_SUCCESS)
     {
@@ -973,7 +966,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p4, VX_TYPE_SCALAR, "norm2_4");
 
     org_khronos_nn_extension_normalization_layer_1_p5 = vxCreateTensor(context, 4, org_khronos_nn_extension_normalization_layer_1_p5Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_1_p5);
     if(status != VX_SUCCESS)
     {
@@ -982,7 +975,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p5, VX_TYPE_TENSOR, "norm2_5");
 
-    org_khronos_nn_extension_pooling_layer_1_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p1);    
+    org_khronos_nn_extension_pooling_layer_1_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_1_p1);
     if(status != VX_SUCCESS)
     {
@@ -991,7 +984,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p1, VX_TYPE_SCALAR, "pool2_1");
 
-    org_khronos_nn_extension_pooling_layer_1_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p2);    
+    org_khronos_nn_extension_pooling_layer_1_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_1_p2);
     if(status != VX_SUCCESS)
     {
@@ -1000,7 +993,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p2, VX_TYPE_SCALAR, "pool2_2");
 
-    org_khronos_nn_extension_pooling_layer_1_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p3);    
+    org_khronos_nn_extension_pooling_layer_1_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_1_p3);
     if(status != VX_SUCCESS)
     {
@@ -1009,7 +1002,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p3, VX_TYPE_SCALAR, "pool2_3");
 
-    org_khronos_nn_extension_pooling_layer_1_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p4);    
+    org_khronos_nn_extension_pooling_layer_1_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_1_p4);
     if(status != VX_SUCCESS)
     {
@@ -1018,7 +1011,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p4, VX_TYPE_SCALAR, "pool2_4");
 
-    org_khronos_nn_extension_pooling_layer_1_p5 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p5);    
+    org_khronos_nn_extension_pooling_layer_1_p5 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_1_p5);
     if(status != VX_SUCCESS)
     {
@@ -1027,7 +1020,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p5, VX_TYPE_SCALAR, "pool2_5");
 
-    org_khronos_nn_extension_pooling_layer_1_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p6);    
+    org_khronos_nn_extension_pooling_layer_1_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_1_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_1_p6);
     if(status != VX_SUCCESS)
     {
@@ -1037,7 +1030,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p6, VX_TYPE_SCALAR, "pool2_6");
 
     org_khronos_nn_extension_pooling_layer_1_p7 = vxCreateTensor(context, 4, org_khronos_nn_extension_pooling_layer_1_p7Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_1_p7);
     if(status != VX_SUCCESS)
     {
@@ -1047,7 +1040,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p7, VX_TYPE_TENSOR, "pool2_7");
 
     org_khronos_nn_extension_convolution_layer_3_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_3_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p1);
     if(status != VX_SUCCESS)
     {
@@ -1057,7 +1050,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p1, VX_TYPE_TENSOR, "conv3_weights");
 
     org_khronos_nn_extension_convolution_layer_3_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_3_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p2);
     if(status != VX_SUCCESS)
     {
@@ -1066,7 +1059,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p2, VX_TYPE_TENSOR, "conv3_bias");
 
-    org_khronos_nn_extension_convolution_layer_3_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p3);    
+    org_khronos_nn_extension_convolution_layer_3_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p3);
     if(status != VX_SUCCESS)
     {
@@ -1075,7 +1068,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p3, VX_TYPE_SCALAR, "conv3_3");
 
-    org_khronos_nn_extension_convolution_layer_3_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p4);    
+    org_khronos_nn_extension_convolution_layer_3_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p4);
     if(status != VX_SUCCESS)
     {
@@ -1084,7 +1077,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p4, VX_TYPE_SCALAR, "conv3_4");
 
-    org_khronos_nn_extension_convolution_layer_3_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p5);    
+    org_khronos_nn_extension_convolution_layer_3_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p5);
     if(status != VX_SUCCESS)
     {
@@ -1093,7 +1086,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p5, VX_TYPE_SCALAR, "conv3_5");
 
-    org_khronos_nn_extension_convolution_layer_3_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p6);    
+    org_khronos_nn_extension_convolution_layer_3_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p6);
     if(status != VX_SUCCESS)
     {
@@ -1102,7 +1095,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p6, VX_TYPE_SCALAR, "conv3_6");
 
-    org_khronos_nn_extension_convolution_layer_3_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p7);    
+    org_khronos_nn_extension_convolution_layer_3_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_3_scalar_p7);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p7);
     if(status != VX_SUCCESS)
     {
@@ -1112,7 +1105,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p7, VX_TYPE_SCALAR, "conv3_7");
 
     org_khronos_nn_extension_convolution_layer_3_p8 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_3_p8Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_3_p8);
     if(status != VX_SUCCESS)
     {
@@ -1121,7 +1114,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p8, VX_TYPE_TENSOR, "conv3_8");
 
-    org_khronos_nn_extension_activation_layer_2_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_2_scalar_p1);    
+    org_khronos_nn_extension_activation_layer_2_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_2_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_2_p1);
     if(status != VX_SUCCESS)
     {
@@ -1130,7 +1123,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_2_p1, VX_TYPE_SCALAR, "relu3_1");
 
-    org_khronos_nn_extension_activation_layer_2_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_2_scalar_p2);    
+    org_khronos_nn_extension_activation_layer_2_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_2_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_2_p2);
     if(status != VX_SUCCESS)
     {
@@ -1139,7 +1132,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_2_p2, VX_TYPE_SCALAR, "relu3_2");
 
-    org_khronos_nn_extension_activation_layer_2_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_2_scalar_p3);    
+    org_khronos_nn_extension_activation_layer_2_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_2_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_2_p3);
     if(status != VX_SUCCESS)
     {
@@ -1149,7 +1142,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_2_p3, VX_TYPE_SCALAR, "relu3_2");
 
     org_khronos_nn_extension_activation_layer_2_p4 = vxCreateTensor(context, 4, org_khronos_nn_extension_activation_layer_2_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_2_p4);
     if(status != VX_SUCCESS)
     {
@@ -1158,7 +1151,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_2_p4, VX_TYPE_TENSOR, "relu3_4");
 
-    outputAllocators_SplitTensor_1_p1 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_2_p4, 4, org_khronos_nn_extension_activation_layer_2_p4_view1_view_start, org_khronos_nn_extension_activation_layer_2_p4_view1_view_end);    
+    outputAllocators_SplitTensor_1_p1 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_2_p4, 4, org_khronos_nn_extension_activation_layer_2_p4_view1_view_start, org_khronos_nn_extension_activation_layer_2_p4_view1_view_end);
     status = vxGetStatus((vx_reference)outputAllocators_SplitTensor_1_p1);
     if(status != VX_SUCCESS)
     {
@@ -1167,7 +1160,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_SplitTensor_1_p1, VX_TYPE_TENSOR, "conv4_0_0");
 
-    outputAllocators_SplitTensor_1_p2 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_2_p4, 4, org_khronos_nn_extension_activation_layer_2_p4_view2_view_start, org_khronos_nn_extension_activation_layer_2_p4_view2_view_end);    
+    outputAllocators_SplitTensor_1_p2 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_2_p4, 4, org_khronos_nn_extension_activation_layer_2_p4_view2_view_start, org_khronos_nn_extension_activation_layer_2_p4_view2_view_end);
     status = vxGetStatus((vx_reference)outputAllocators_SplitTensor_1_p2);
     if(status != VX_SUCCESS)
     {
@@ -1177,7 +1170,7 @@
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_SplitTensor_1_p2, VX_TYPE_TENSOR, "conv4_1_0");
 
     org_khronos_nn_extension_convolution_layer_5_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_5_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p1);
     if(status != VX_SUCCESS)
     {
@@ -1187,7 +1180,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p1, VX_TYPE_TENSOR, "conv4_0_weights");
 
     org_khronos_nn_extension_convolution_layer_5_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_5_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p2);
     if(status != VX_SUCCESS)
     {
@@ -1196,7 +1189,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p2, VX_TYPE_TENSOR, "conv4_0_bias");
 
-    org_khronos_nn_extension_convolution_layer_5_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p3);    
+    org_khronos_nn_extension_convolution_layer_5_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p3);
     if(status != VX_SUCCESS)
     {
@@ -1205,7 +1198,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p3, VX_TYPE_SCALAR, "conv4_0_3");
 
-    org_khronos_nn_extension_convolution_layer_5_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p4);    
+    org_khronos_nn_extension_convolution_layer_5_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p4);
     if(status != VX_SUCCESS)
     {
@@ -1214,7 +1207,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p4, VX_TYPE_SCALAR, "conv4_0_4");
 
-    org_khronos_nn_extension_convolution_layer_5_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p5);    
+    org_khronos_nn_extension_convolution_layer_5_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p5);
     if(status != VX_SUCCESS)
     {
@@ -1223,7 +1216,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p5, VX_TYPE_SCALAR, "conv4_0_5");
 
-    org_khronos_nn_extension_convolution_layer_5_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p6);    
+    org_khronos_nn_extension_convolution_layer_5_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p6);
     if(status != VX_SUCCESS)
     {
@@ -1232,7 +1225,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p6, VX_TYPE_SCALAR, "conv4_0_6");
 
-    org_khronos_nn_extension_convolution_layer_5_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p7);    
+    org_khronos_nn_extension_convolution_layer_5_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_5_scalar_p7);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p7);
     if(status != VX_SUCCESS)
     {
@@ -1241,7 +1234,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p7, VX_TYPE_SCALAR, "conv4_0_7");
 
-    org_khronos_nn_extension_convolution_layer_5_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_1_p0, 4, org_khronos_nn_extension_convolution_layer_5_p8_view_view_start, org_khronos_nn_extension_convolution_layer_5_p8_view_view_end);    
+    org_khronos_nn_extension_convolution_layer_5_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_1_p0, 4, org_khronos_nn_extension_convolution_layer_5_p8_view_view_start, org_khronos_nn_extension_convolution_layer_5_p8_view_view_end);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p8);
     if(status != VX_SUCCESS)
     {
@@ -1251,7 +1244,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p8, VX_TYPE_TENSOR, "conv4_0_8");
 
     org_khronos_nn_extension_convolution_layer_4_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_4_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p1);
     if(status != VX_SUCCESS)
     {
@@ -1261,7 +1254,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p1, VX_TYPE_TENSOR, "conv4_1_weights");
 
     org_khronos_nn_extension_convolution_layer_4_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_4_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p2);
     if(status != VX_SUCCESS)
     {
@@ -1270,7 +1263,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p2, VX_TYPE_TENSOR, "conv4_1_bias");
 
-    org_khronos_nn_extension_convolution_layer_4_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p3);    
+    org_khronos_nn_extension_convolution_layer_4_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p3);
     if(status != VX_SUCCESS)
     {
@@ -1279,7 +1272,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p3, VX_TYPE_SCALAR, "conv4_1_3");
 
-    org_khronos_nn_extension_convolution_layer_4_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p4);    
+    org_khronos_nn_extension_convolution_layer_4_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p4);
     if(status != VX_SUCCESS)
     {
@@ -1288,7 +1281,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p4, VX_TYPE_SCALAR, "conv4_1_4");
 
-    org_khronos_nn_extension_convolution_layer_4_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p5);    
+    org_khronos_nn_extension_convolution_layer_4_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p5);
     if(status != VX_SUCCESS)
     {
@@ -1297,7 +1290,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p5, VX_TYPE_SCALAR, "conv4_1_5");
 
-    org_khronos_nn_extension_convolution_layer_4_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p6);    
+    org_khronos_nn_extension_convolution_layer_4_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p6);
     if(status != VX_SUCCESS)
     {
@@ -1306,7 +1299,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p6, VX_TYPE_SCALAR, "conv4_1_6");
 
-    org_khronos_nn_extension_convolution_layer_4_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p7);    
+    org_khronos_nn_extension_convolution_layer_4_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_4_scalar_p7);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p7);
     if(status != VX_SUCCESS)
     {
@@ -1315,7 +1308,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p7, VX_TYPE_SCALAR, "conv4_1_7");
 
-    org_khronos_nn_extension_convolution_layer_4_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_1_p0, 4, org_khronos_nn_extension_convolution_layer_4_p8_view_view_start, org_khronos_nn_extension_convolution_layer_4_p8_view_view_end);    
+    org_khronos_nn_extension_convolution_layer_4_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_1_p0, 4, org_khronos_nn_extension_convolution_layer_4_p8_view_view_start, org_khronos_nn_extension_convolution_layer_4_p8_view_view_end);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_4_p8);
     if(status != VX_SUCCESS)
     {
@@ -1324,7 +1317,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p8, VX_TYPE_TENSOR, "conv4_1_8");
 
-    org_khronos_nn_extension_activation_layer_3_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_3_scalar_p1);    
+    org_khronos_nn_extension_activation_layer_3_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_3_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_3_p1);
     if(status != VX_SUCCESS)
     {
@@ -1333,7 +1326,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_3_p1, VX_TYPE_SCALAR, "relu4_1");
 
-    org_khronos_nn_extension_activation_layer_3_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_3_scalar_p2);    
+    org_khronos_nn_extension_activation_layer_3_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_3_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_3_p2);
     if(status != VX_SUCCESS)
     {
@@ -1342,7 +1335,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_3_p2, VX_TYPE_SCALAR, "relu4_2");
 
-    org_khronos_nn_extension_activation_layer_3_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_3_scalar_p3);    
+    org_khronos_nn_extension_activation_layer_3_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_3_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_3_p3);
     if(status != VX_SUCCESS)
     {
@@ -1352,7 +1345,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_3_p3, VX_TYPE_SCALAR, "relu4_2");
 
     org_khronos_nn_extension_activation_layer_3_p4 = vxCreateTensor(context, 4, org_khronos_nn_extension_activation_layer_3_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_3_p4);
     if(status != VX_SUCCESS)
     {
@@ -1361,7 +1354,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_3_p4, VX_TYPE_TENSOR, "relu4_4");
 
-    outputAllocators_SplitTensor_2_p1 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_3_p4, 4, org_khronos_nn_extension_activation_layer_3_p4_view1_view_start, org_khronos_nn_extension_activation_layer_3_p4_view1_view_end);    
+    outputAllocators_SplitTensor_2_p1 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_3_p4, 4, org_khronos_nn_extension_activation_layer_3_p4_view1_view_start, org_khronos_nn_extension_activation_layer_3_p4_view1_view_end);
     status = vxGetStatus((vx_reference)outputAllocators_SplitTensor_2_p1);
     if(status != VX_SUCCESS)
     {
@@ -1370,7 +1363,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_SplitTensor_2_p1, VX_TYPE_TENSOR, "conv5_0_0");
 
-    outputAllocators_SplitTensor_2_p2 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_3_p4, 4, org_khronos_nn_extension_activation_layer_3_p4_view2_view_start, org_khronos_nn_extension_activation_layer_3_p4_view2_view_end);    
+    outputAllocators_SplitTensor_2_p2 = vxCreateTensorFromView(org_khronos_nn_extension_activation_layer_3_p4, 4, org_khronos_nn_extension_activation_layer_3_p4_view2_view_start, org_khronos_nn_extension_activation_layer_3_p4_view2_view_end);
     status = vxGetStatus((vx_reference)outputAllocators_SplitTensor_2_p2);
     if(status != VX_SUCCESS)
     {
@@ -1380,7 +1373,7 @@
     AddVXObject(pObjectContainer, (vx_reference)outputAllocators_SplitTensor_2_p2, VX_TYPE_TENSOR, "conv5_1_0");
 
     org_khronos_nn_extension_convolution_layer_7_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_7_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p1);
     if(status != VX_SUCCESS)
     {
@@ -1390,7 +1383,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p1, VX_TYPE_TENSOR, "conv5_0_weights");
 
     org_khronos_nn_extension_convolution_layer_7_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_7_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p2);
     if(status != VX_SUCCESS)
     {
@@ -1399,7 +1392,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p2, VX_TYPE_TENSOR, "conv5_0_bias");
 
-    org_khronos_nn_extension_convolution_layer_7_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p3);    
+    org_khronos_nn_extension_convolution_layer_7_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p3);
     if(status != VX_SUCCESS)
     {
@@ -1408,7 +1401,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p3, VX_TYPE_SCALAR, "conv5_0_3");
 
-    org_khronos_nn_extension_convolution_layer_7_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p4);    
+    org_khronos_nn_extension_convolution_layer_7_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p4);
     if(status != VX_SUCCESS)
     {
@@ -1417,7 +1410,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p4, VX_TYPE_SCALAR, "conv5_0_4");
 
-    org_khronos_nn_extension_convolution_layer_7_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p5);    
+    org_khronos_nn_extension_convolution_layer_7_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p5);
     if(status != VX_SUCCESS)
     {
@@ -1426,7 +1419,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p5, VX_TYPE_SCALAR, "conv5_0_5");
 
-    org_khronos_nn_extension_convolution_layer_7_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p6);    
+    org_khronos_nn_extension_convolution_layer_7_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p6);
     if(status != VX_SUCCESS)
     {
@@ -1435,7 +1428,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p6, VX_TYPE_SCALAR, "conv5_0_6");
 
-    org_khronos_nn_extension_convolution_layer_7_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p7);    
+    org_khronos_nn_extension_convolution_layer_7_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_7_scalar_p7);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p7);
     if(status != VX_SUCCESS)
     {
@@ -1444,7 +1437,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p7, VX_TYPE_SCALAR, "conv5_0_7");
 
-    org_khronos_nn_extension_convolution_layer_7_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_2_p0, 4, org_khronos_nn_extension_convolution_layer_7_p8_view_view_start, org_khronos_nn_extension_convolution_layer_7_p8_view_view_end);    
+    org_khronos_nn_extension_convolution_layer_7_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_2_p0, 4, org_khronos_nn_extension_convolution_layer_7_p8_view_view_start, org_khronos_nn_extension_convolution_layer_7_p8_view_view_end);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_7_p8);
     if(status != VX_SUCCESS)
     {
@@ -1454,7 +1447,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p8, VX_TYPE_TENSOR, "conv5_0_8");
 
     org_khronos_nn_extension_convolution_layer_6_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_6_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p1);
     if(status != VX_SUCCESS)
     {
@@ -1464,7 +1457,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p1, VX_TYPE_TENSOR, "conv5_1_weights");
 
     org_khronos_nn_extension_convolution_layer_6_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_6_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p2);
     if(status != VX_SUCCESS)
     {
@@ -1473,7 +1466,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p2, VX_TYPE_TENSOR, "conv5_1_bias");
 
-    org_khronos_nn_extension_convolution_layer_6_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p3);    
+    org_khronos_nn_extension_convolution_layer_6_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p3);
     if(status != VX_SUCCESS)
     {
@@ -1482,7 +1475,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p3, VX_TYPE_SCALAR, "conv5_1_3");
 
-    org_khronos_nn_extension_convolution_layer_6_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p4);    
+    org_khronos_nn_extension_convolution_layer_6_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p4);
     if(status != VX_SUCCESS)
     {
@@ -1491,7 +1484,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p4, VX_TYPE_SCALAR, "conv5_1_4");
 
-    org_khronos_nn_extension_convolution_layer_6_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p5);    
+    org_khronos_nn_extension_convolution_layer_6_p5 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p5);
     if(status != VX_SUCCESS)
     {
@@ -1500,7 +1493,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p5, VX_TYPE_SCALAR, "conv5_1_5");
 
-    org_khronos_nn_extension_convolution_layer_6_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p6);    
+    org_khronos_nn_extension_convolution_layer_6_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p6);
     if(status != VX_SUCCESS)
     {
@@ -1509,7 +1502,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p6, VX_TYPE_SCALAR, "conv5_1_6");
 
-    org_khronos_nn_extension_convolution_layer_6_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p7);    
+    org_khronos_nn_extension_convolution_layer_6_p7 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_convolution_layer_6_scalar_p7);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p7);
     if(status != VX_SUCCESS)
     {
@@ -1518,7 +1511,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p7, VX_TYPE_SCALAR, "conv5_1_7");
 
-    org_khronos_nn_extension_convolution_layer_6_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_2_p0, 4, org_khronos_nn_extension_convolution_layer_6_p8_view_view_start, org_khronos_nn_extension_convolution_layer_6_p8_view_view_end);    
+    org_khronos_nn_extension_convolution_layer_6_p8 = vxCreateTensorFromView(outputAllocators_MergeTensor_2_p0, 4, org_khronos_nn_extension_convolution_layer_6_p8_view_view_start, org_khronos_nn_extension_convolution_layer_6_p8_view_view_end);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_6_p8);
     if(status != VX_SUCCESS)
     {
@@ -1527,7 +1520,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p8, VX_TYPE_TENSOR, "conv5_1_8");
 
-    org_khronos_nn_extension_activation_layer_4_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_4_scalar_p1);    
+    org_khronos_nn_extension_activation_layer_4_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_4_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_4_p1);
     if(status != VX_SUCCESS)
     {
@@ -1536,7 +1529,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_4_p1, VX_TYPE_SCALAR, "relu5_1");
 
-    org_khronos_nn_extension_activation_layer_4_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_4_scalar_p2);    
+    org_khronos_nn_extension_activation_layer_4_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_4_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_4_p2);
     if(status != VX_SUCCESS)
     {
@@ -1545,7 +1538,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_4_p2, VX_TYPE_SCALAR, "relu5_2");
 
-    org_khronos_nn_extension_activation_layer_4_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_4_scalar_p3);    
+    org_khronos_nn_extension_activation_layer_4_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_4_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_4_p3);
     if(status != VX_SUCCESS)
     {
@@ -1555,7 +1548,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_4_p3, VX_TYPE_SCALAR, "relu5_2");
 
     org_khronos_nn_extension_activation_layer_4_p4 = vxCreateTensor(context, 4, org_khronos_nn_extension_activation_layer_4_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_4_p4);
     if(status != VX_SUCCESS)
     {
@@ -1564,7 +1557,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_4_p4, VX_TYPE_TENSOR, "relu5_4");
 
-    org_khronos_nn_extension_pooling_layer_2_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p1);    
+    org_khronos_nn_extension_pooling_layer_2_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_2_p1);
     if(status != VX_SUCCESS)
     {
@@ -1573,7 +1566,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p1, VX_TYPE_SCALAR, "pool5_1");
 
-    org_khronos_nn_extension_pooling_layer_2_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p2);    
+    org_khronos_nn_extension_pooling_layer_2_p2 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_2_p2);
     if(status != VX_SUCCESS)
     {
@@ -1582,7 +1575,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p2, VX_TYPE_SCALAR, "pool5_2");
 
-    org_khronos_nn_extension_pooling_layer_2_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p3);    
+    org_khronos_nn_extension_pooling_layer_2_p3 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_2_p3);
     if(status != VX_SUCCESS)
     {
@@ -1591,7 +1584,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p3, VX_TYPE_SCALAR, "pool5_3");
 
-    org_khronos_nn_extension_pooling_layer_2_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p4);    
+    org_khronos_nn_extension_pooling_layer_2_p4 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_2_p4);
     if(status != VX_SUCCESS)
     {
@@ -1600,7 +1593,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p4, VX_TYPE_SCALAR, "pool5_4");
 
-    org_khronos_nn_extension_pooling_layer_2_p5 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p5);    
+    org_khronos_nn_extension_pooling_layer_2_p5 = vxCreateScalar(context, VX_TYPE_SIZE, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p5);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_2_p5);
     if(status != VX_SUCCESS)
     {
@@ -1609,7 +1602,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p5, VX_TYPE_SCALAR, "pool5_5");
 
-    org_khronos_nn_extension_pooling_layer_2_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p6);    
+    org_khronos_nn_extension_pooling_layer_2_p6 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_pooling_layer_2_scalar_p6);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_2_p6);
     if(status != VX_SUCCESS)
     {
@@ -1619,7 +1612,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p6, VX_TYPE_SCALAR, "pool5_6");
 
     org_khronos_nn_extension_pooling_layer_2_p7 = vxCreateTensor(context, 4, org_khronos_nn_extension_pooling_layer_2_p7Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_pooling_layer_2_p7);
     if(status != VX_SUCCESS)
     {
@@ -1629,7 +1622,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p7, VX_TYPE_TENSOR, "pool5_7");
 
     org_khronos_nn_extension_fully_connected_layer_0_p1 = vxCreateTensor(context, 4, org_khronos_nn_extension_fully_connected_layer_0_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p1);
     if(status != VX_SUCCESS)
     {
@@ -1639,7 +1632,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p1, VX_TYPE_TENSOR, "fc6_weights");
 
     org_khronos_nn_extension_fully_connected_layer_0_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_fully_connected_layer_0_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p2);
     if(status != VX_SUCCESS)
     {
@@ -1648,7 +1641,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p2, VX_TYPE_TENSOR, "fc6_bias");
 
-    org_khronos_nn_extension_fully_connected_layer_0_p3 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_0_scalar_p3);    
+    org_khronos_nn_extension_fully_connected_layer_0_p3 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_0_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p3);
     if(status != VX_SUCCESS)
     {
@@ -1657,7 +1650,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p3, VX_TYPE_SCALAR, "fc6_3");
 
-    org_khronos_nn_extension_fully_connected_layer_0_p4 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_0_scalar_p4);    
+    org_khronos_nn_extension_fully_connected_layer_0_p4 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_0_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p4);
     if(status != VX_SUCCESS)
     {
@@ -1667,7 +1660,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p4, VX_TYPE_SCALAR, "fc6_4");
 
     org_khronos_nn_extension_fully_connected_layer_0_p5 = vxCreateTensor(context, 2, org_khronos_nn_extension_fully_connected_layer_0_p5Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p5);
     if(status != VX_SUCCESS)
     {
@@ -1676,7 +1669,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p5, VX_TYPE_TENSOR, "fc6_5");
 
-    org_khronos_nn_extension_activation_layer_5_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_5_scalar_p1);    
+    org_khronos_nn_extension_activation_layer_5_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_5_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_5_p1);
     if(status != VX_SUCCESS)
     {
@@ -1685,7 +1678,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_5_p1, VX_TYPE_SCALAR, "relu6_1");
 
-    org_khronos_nn_extension_activation_layer_5_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_5_scalar_p2);    
+    org_khronos_nn_extension_activation_layer_5_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_5_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_5_p2);
     if(status != VX_SUCCESS)
     {
@@ -1694,7 +1687,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_5_p2, VX_TYPE_SCALAR, "relu6_2");
 
-    org_khronos_nn_extension_activation_layer_5_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_5_scalar_p3);    
+    org_khronos_nn_extension_activation_layer_5_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_5_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_5_p3);
     if(status != VX_SUCCESS)
     {
@@ -1704,7 +1697,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_5_p3, VX_TYPE_SCALAR, "relu6_2");
 
     org_khronos_nn_extension_activation_layer_5_p4 = vxCreateTensor(context, 2, org_khronos_nn_extension_activation_layer_5_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_5_p4);
     if(status != VX_SUCCESS)
     {
@@ -1714,7 +1707,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_5_p4, VX_TYPE_TENSOR, "relu6_4");
 
     org_khronos_nn_extension_fully_connected_layer_1_p1 = vxCreateTensor(context, 2, org_khronos_nn_extension_fully_connected_layer_1_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p1);
     if(status != VX_SUCCESS)
     {
@@ -1724,7 +1717,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p1, VX_TYPE_TENSOR, "fc7_weights");
 
     org_khronos_nn_extension_fully_connected_layer_1_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_fully_connected_layer_1_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p2);
     if(status != VX_SUCCESS)
     {
@@ -1733,7 +1726,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p2, VX_TYPE_TENSOR, "fc7_bias");
 
-    org_khronos_nn_extension_fully_connected_layer_1_p3 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_1_scalar_p3);    
+    org_khronos_nn_extension_fully_connected_layer_1_p3 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_1_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p3);
     if(status != VX_SUCCESS)
     {
@@ -1742,7 +1735,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p3, VX_TYPE_SCALAR, "fc7_3");
 
-    org_khronos_nn_extension_fully_connected_layer_1_p4 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_1_scalar_p4);    
+    org_khronos_nn_extension_fully_connected_layer_1_p4 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_1_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p4);
     if(status != VX_SUCCESS)
     {
@@ -1752,7 +1745,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p4, VX_TYPE_SCALAR, "fc7_4");
 
     org_khronos_nn_extension_fully_connected_layer_1_p5 = vxCreateTensor(context, 2, org_khronos_nn_extension_fully_connected_layer_1_p5Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p5);
     if(status != VX_SUCCESS)
     {
@@ -1761,7 +1754,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_1_p5, VX_TYPE_TENSOR, "fc7_5");
 
-    org_khronos_nn_extension_activation_layer_6_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_6_scalar_p1);    
+    org_khronos_nn_extension_activation_layer_6_p1 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_activation_layer_6_scalar_p1);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_6_p1);
     if(status != VX_SUCCESS)
     {
@@ -1770,7 +1763,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_6_p1, VX_TYPE_SCALAR, "relu7_1");
 
-    org_khronos_nn_extension_activation_layer_6_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_6_scalar_p2);    
+    org_khronos_nn_extension_activation_layer_6_p2 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_6_scalar_p2);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_6_p2);
     if(status != VX_SUCCESS)
     {
@@ -1779,7 +1772,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_6_p2, VX_TYPE_SCALAR, "relu7_2");
 
-    org_khronos_nn_extension_activation_layer_6_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_6_scalar_p3);    
+    org_khronos_nn_extension_activation_layer_6_p3 = vxCreateScalar(context, VX_TYPE_FLOAT32, (void*)&org_khronos_nn_extension_activation_layer_6_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_6_p3);
     if(status != VX_SUCCESS)
     {
@@ -1789,7 +1782,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_6_p3, VX_TYPE_SCALAR, "relu7_2");
 
     org_khronos_nn_extension_activation_layer_6_p4 = vxCreateTensor(context, 2, org_khronos_nn_extension_activation_layer_6_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_6_p4);
     if(status != VX_SUCCESS)
     {
@@ -1799,7 +1792,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_6_p4, VX_TYPE_TENSOR, "relu7_4");
 
     org_khronos_nn_extension_fully_connected_layer_2_p1 = vxCreateTensor(context, 2, org_khronos_nn_extension_fully_connected_layer_2_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p1);
     if(status != VX_SUCCESS)
     {
@@ -1809,7 +1802,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p1, VX_TYPE_TENSOR, "fc8_weights");
 
     org_khronos_nn_extension_fully_connected_layer_2_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_fully_connected_layer_2_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p2);
     if(status != VX_SUCCESS)
     {
@@ -1818,7 +1811,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p2, VX_TYPE_TENSOR, "fc8_bias");
 
-    org_khronos_nn_extension_fully_connected_layer_2_p3 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_2_scalar_p3);    
+    org_khronos_nn_extension_fully_connected_layer_2_p3 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_2_scalar_p3);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p3);
     if(status != VX_SUCCESS)
     {
@@ -1827,7 +1820,7 @@
     }
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p3, VX_TYPE_SCALAR, "fc8_3");
 
-    org_khronos_nn_extension_fully_connected_layer_2_p4 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_2_scalar_p4);    
+    org_khronos_nn_extension_fully_connected_layer_2_p4 = vxCreateScalar(context, VX_TYPE_ENUM, (void*)&org_khronos_nn_extension_fully_connected_layer_2_scalar_p4);
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p4);
     if(status != VX_SUCCESS)
     {
@@ -1837,7 +1830,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p4, VX_TYPE_SCALAR, "fc8_4");
 
     org_khronos_nn_extension_fully_connected_layer_2_p5 = vxCreateTensor(context, 2, org_khronos_nn_extension_fully_connected_layer_2_p5Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_2_p5);
     if(status != VX_SUCCESS)
     {
@@ -1856,7 +1849,7 @@
     AddVXObject(pObjectContainer, (vx_reference)com_cnn_helpers_scalemddata_0_p1, VX_TYPE_SCALAR, "Power0_1");
 
     com_cnn_helpers_scalemddata_0_p2 = vxCreateTensor(context, 2, com_cnn_helpers_scalemddata_0_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)com_cnn_helpers_scalemddata_0_p2);
     if(status != VX_SUCCESS)
     {
@@ -1866,7 +1859,7 @@
     AddVXObject(pObjectContainer, (vx_reference)com_cnn_helpers_scalemddata_0_p2, VX_TYPE_TENSOR, "Power0_2");
 
     org_khronos_nn_extension_softmax_layer_0_p1 = vxCreateTensor(context, 2, org_khronos_nn_extension_softmax_layer_0_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_softmax_layer_0_p1);
     if(status != VX_SUCCESS)
     {
@@ -1909,7 +1902,7 @@
 	//status = CreateNode(graph, org_khronos_nn_extension_normalization_layer_Kernel, pObjectContainer, "org_khronos_nn_extension_normalization_layer_0", filteredNodeList, filteredNodeCount, &org_khronos_nn_extension_normalization_layer_0);
 	//if(status != VX_SUCCESS)
 	//    return status;
-	org_khronos_nn_extension_normalization_layer_0 = vxNormalizationLayer(graph, org_khronos_nn_extension_activation_layer_0_p4, norm_params.type, norm_params.normalization_size, norm_params.alpha, norm_params.beta,
+	org_khronos_nn_extension_normalization_layer_0 = vxLocalResponseNormalizationLayer(graph, org_khronos_nn_extension_activation_layer_0_p4, norm_params.type, norm_params.normalization_size, norm_params.alpha, norm_params.beta, 1.0f,
 		org_khronos_nn_extension_normalization_layer_0_p5);
 	status = vxGetStatus((vx_reference)org_khronos_nn_extension_normalization_layer_0);
 	if (status != VX_SUCCESS)
@@ -1974,8 +1967,8 @@
 	//status = CreateNode(graph, org_khronos_nn_extension_normalization_layer_Kernel, pObjectContainer, "org_khronos_nn_extension_normalization_layer_1", filteredNodeList, filteredNodeCount, &org_khronos_nn_extension_normalization_layer_1);
 	//if(status != VX_SUCCESS)
 	//    return status;
-	org_khronos_nn_extension_normalization_layer_1 = vxNormalizationLayer(graph, org_khronos_nn_extension_activation_layer_1_p4, norm_params.type, norm_params.normalization_size, norm_params.alpha,
-		norm_params.beta, org_khronos_nn_extension_normalization_layer_1_p5);
+	org_khronos_nn_extension_normalization_layer_1 = vxLocalResponseNormalizationLayer(graph, org_khronos_nn_extension_activation_layer_1_p4, norm_params.type, norm_params.normalization_size, norm_params.alpha,
+		norm_params.beta, 1.0f, org_khronos_nn_extension_normalization_layer_1_p5);
 	if (status != VX_SUCCESS)
 	{
 		WriteLog("ERROR: failed to create node org_khronos_nn_extension_normalization_layer_1\n");
@@ -2211,10 +2204,10 @@
 		return status;
 	}
 	AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_softmax_layer_0, VX_TYPE_NODE, "org_khronos_nn_extension_softmax_layer_0");
-        
- 
+
+
 
     return status;
 }
 
-#endif
+#endif//OPENVX_CONFORMANCE_NEURAL_NETWORKS
diff --git a/test_conformance/Networks/src/graph_googlenet.c b/test_conformance/Networks/src/graph_googlenet.c
index 8781968..1c9cb86 100644
--- a/test_conformance/Networks/src/graph_googlenet.c
+++ b/test_conformance/Networks/src/graph_googlenet.c
@@ -1,8 +1,9 @@
 /** @file graph.h
- *  @brief 
+ *  @brief
  *  This file contains the implementation of the generated graph factory function
  */
 
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
 #ifdef OPENVX_USE_NN
 
 #include <stdio.h>
@@ -123,13 +124,12 @@
 
 static vx_status Graph(vx_context context, vx_graph graph, ObjectRefContainerType* pObjectContainer, char* filteredNodeList[], size_t filteredNodeCount, vx_tensor org_khronos_nn_extension_convolution_layer_0_p0, vx_tensor org_khronos_nn_extension_convolution_layer_0_p1, vx_tensor org_khronos_nn_extension_convolution_layer_0_p2, vx_nn_convolution_params_t org_khronos_nn_extension_convolution_layer_0_p3, vx_tensor org_khronos_nn_extension_convolution_layer_0_p8)
 {
-    vx_status status = VX_SUCCESS;    
+    vx_status status = VX_SUCCESS;
 
     //
     // Kernel Declarations
     //
 
-    vx_kernel org_khronos_nn_extension_convolution_layer_Kernel;
     vx_kernel org_khronos_nn_extension_activation_layer_Kernel;
     vx_kernel org_khronos_nn_extension_pooling_layer_Kernel;
     vx_kernel org_khronos_nn_extension_normalization_layer_Kernel;
@@ -3176,7 +3176,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p7, VX_TYPE_SCALAR, "inception_3a_5x5_7");
 
     org_khronos_nn_extension_convolution_layer_5_p8 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_5_p8Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_5_p8);
     if(status != VX_SUCCESS)
     {
@@ -3379,7 +3379,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_12_p1, VX_TYPE_TENSOR, "inception_3b_3x3_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_12_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_12_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_12_p2);
     if(status != VX_SUCCESS)
     {
@@ -3454,7 +3454,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_10_p1, VX_TYPE_TENSOR, "inception_3b_5x5_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_10_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_10_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_10_p2);
     if(status != VX_SUCCESS)
     {
@@ -3509,7 +3509,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_10_p7, VX_TYPE_SCALAR, "inception_3b_5x5_reduce_7");
 
     org_khronos_nn_extension_convolution_layer_10_p8 = vxCreateTensor(context, 4, org_khronos_nn_extension_convolution_layer_10_p8Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_10_p8);
     if(status != VX_SUCCESS)
     {
@@ -3646,7 +3646,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_activation_layer_12_p3, VX_TYPE_SCALAR, "inception_3b_relu_3x3_reduce_2");
 
     org_khronos_nn_extension_activation_layer_12_p4 = vxCreateTensor(context, 4, org_khronos_nn_extension_activation_layer_12_p4Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_activation_layer_12_p4);
     if(status != VX_SUCCESS)
     {
@@ -5639,7 +5639,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_30_p1, VX_TYPE_TENSOR, "inception_4c_3x3_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_30_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_30_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_30_p2);
     if(status != VX_SUCCESS)
     {
@@ -5714,7 +5714,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_28_p1, VX_TYPE_TENSOR, "inception_4c_5x5_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_28_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_28_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_28_p2);
     if(status != VX_SUCCESS)
     {
@@ -6371,7 +6371,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_36_p1, VX_TYPE_TENSOR, "inception_4d_3x3_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_36_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_36_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_36_p2);
     if(status != VX_SUCCESS)
     {
@@ -6446,7 +6446,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_34_p1, VX_TYPE_TENSOR, "inception_4d_5x5_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_34_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_34_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_34_p2);
     if(status != VX_SUCCESS)
     {
@@ -7103,7 +7103,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_42_p1, VX_TYPE_TENSOR, "inception_4e_3x3_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_42_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_42_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_42_p2);
     if(status != VX_SUCCESS)
     {
@@ -7178,7 +7178,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_convolution_layer_40_p1, VX_TYPE_TENSOR, "inception_4e_5x5_reduce_weights");
 
     org_khronos_nn_extension_convolution_layer_40_p2 = vxCreateTensor(context, 1, org_khronos_nn_extension_convolution_layer_40_p2Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_convolution_layer_40_p2);
     if(status != VX_SUCCESS)
     {
@@ -9380,7 +9380,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p4, VX_TYPE_SCALAR, "loss3_classifier_4");
 
     org_khronos_nn_extension_fully_connected_layer_0_p5 = vxCreateTensor(context, 2, org_khronos_nn_extension_fully_connected_layer_0_p5Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p5);
     if(status != VX_SUCCESS)
     {
@@ -9437,7 +9437,7 @@
     AddVXObject(pObjectContainer, (vx_reference)org_khronos_openvx_tensor_multiply_0_p5, VX_TYPE_TENSOR, "Power0_5");
 
     org_khronos_nn_extension_softmax_layer_0_p1 = vxCreateTensor(context, 2, org_khronos_nn_extension_softmax_layer_0_p1Dimensions ,VX_TYPE_INT16, 8 );
-    
+
     status = vxGetStatus((vx_reference)org_khronos_nn_extension_softmax_layer_0_p1);
     if(status != VX_SUCCESS)
     {
@@ -10535,83 +10535,83 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_0, "org_khronos_nn_extension_convolution_layer_0", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_0_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_0, "org_khronos_nn_extension_activation_layer_0", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_0_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_0, "org_khronos_nn_extension_activation_layer_0", 1, (vx_reference)org_khronos_nn_extension_activation_layer_0_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_0, "org_khronos_nn_extension_activation_layer_0", 2, (vx_reference)org_khronos_nn_extension_activation_layer_0_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_0, "org_khronos_nn_extension_activation_layer_0", 3, (vx_reference)org_khronos_nn_extension_activation_layer_0_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_0, "org_khronos_nn_extension_activation_layer_0", 4, (vx_reference)org_khronos_nn_extension_activation_layer_0_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 0, (vx_reference)org_khronos_nn_extension_activation_layer_0_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_0, "org_khronos_nn_extension_pooling_layer_0", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_0, "org_khronos_nn_extension_normalization_layer_0", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_0_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_0, "org_khronos_nn_extension_normalization_layer_0", 1, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_0, "org_khronos_nn_extension_normalization_layer_0", 2, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_0, "org_khronos_nn_extension_normalization_layer_0", 3, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_0, "org_khronos_nn_extension_normalization_layer_0", 4, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_0, "org_khronos_nn_extension_normalization_layer_0", 5, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_1, "org_khronos_nn_extension_convolution_layer_1", 0, (vx_reference)org_khronos_nn_extension_normalization_layer_0_p5);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -10647,27 +10647,27 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_1, "org_khronos_nn_extension_convolution_layer_1", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_1, "org_khronos_nn_extension_activation_layer_1", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_1_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_1, "org_khronos_nn_extension_activation_layer_1", 1, (vx_reference)org_khronos_nn_extension_activation_layer_1_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_1, "org_khronos_nn_extension_activation_layer_1", 2, (vx_reference)org_khronos_nn_extension_activation_layer_1_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_1, "org_khronos_nn_extension_activation_layer_1", 3, (vx_reference)org_khronos_nn_extension_activation_layer_1_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_1, "org_khronos_nn_extension_activation_layer_1", 4, (vx_reference)org_khronos_nn_extension_activation_layer_1_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_2, "org_khronos_nn_extension_convolution_layer_2", 0, (vx_reference)org_khronos_nn_extension_activation_layer_1_p4);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -10703,83 +10703,83 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_2, "org_khronos_nn_extension_convolution_layer_2", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_2, "org_khronos_nn_extension_activation_layer_2", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_2_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_2, "org_khronos_nn_extension_activation_layer_2", 1, (vx_reference)org_khronos_nn_extension_activation_layer_2_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_2, "org_khronos_nn_extension_activation_layer_2", 2, (vx_reference)org_khronos_nn_extension_activation_layer_2_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_2, "org_khronos_nn_extension_activation_layer_2", 3, (vx_reference)org_khronos_nn_extension_activation_layer_2_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_2, "org_khronos_nn_extension_activation_layer_2", 4, (vx_reference)org_khronos_nn_extension_activation_layer_2_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_1, "org_khronos_nn_extension_normalization_layer_1", 0, (vx_reference)org_khronos_nn_extension_activation_layer_2_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_1, "org_khronos_nn_extension_normalization_layer_1", 1, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_1, "org_khronos_nn_extension_normalization_layer_1", 2, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_1, "org_khronos_nn_extension_normalization_layer_1", 3, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_1, "org_khronos_nn_extension_normalization_layer_1", 4, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_normalization_layer_1, "org_khronos_nn_extension_normalization_layer_1", 5, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 0, (vx_reference)org_khronos_nn_extension_normalization_layer_1_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_1, "org_khronos_nn_extension_pooling_layer_1", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_8, "org_khronos_nn_extension_convolution_layer_8", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -10887,99 +10887,99 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_4, "org_khronos_nn_extension_convolution_layer_4", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_1_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_2, "org_khronos_nn_extension_pooling_layer_2", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_8, "org_khronos_nn_extension_activation_layer_8", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_8_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_8, "org_khronos_nn_extension_activation_layer_8", 1, (vx_reference)org_khronos_nn_extension_activation_layer_8_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_8, "org_khronos_nn_extension_activation_layer_8", 2, (vx_reference)org_khronos_nn_extension_activation_layer_8_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_8, "org_khronos_nn_extension_activation_layer_8", 3, (vx_reference)org_khronos_nn_extension_activation_layer_8_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_8, "org_khronos_nn_extension_activation_layer_8", 4, (vx_reference)org_khronos_nn_extension_activation_layer_8_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_6, "org_khronos_nn_extension_activation_layer_6", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_6_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_6, "org_khronos_nn_extension_activation_layer_6", 1, (vx_reference)org_khronos_nn_extension_activation_layer_6_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_6, "org_khronos_nn_extension_activation_layer_6", 2, (vx_reference)org_khronos_nn_extension_activation_layer_6_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_6, "org_khronos_nn_extension_activation_layer_6", 3, (vx_reference)org_khronos_nn_extension_activation_layer_6_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_6, "org_khronos_nn_extension_activation_layer_6", 4, (vx_reference)org_khronos_nn_extension_activation_layer_6_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_4, "org_khronos_nn_extension_activation_layer_4", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_4_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_4, "org_khronos_nn_extension_activation_layer_4", 1, (vx_reference)org_khronos_nn_extension_activation_layer_4_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_4, "org_khronos_nn_extension_activation_layer_4", 2, (vx_reference)org_khronos_nn_extension_activation_layer_4_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_4, "org_khronos_nn_extension_activation_layer_4", 3, (vx_reference)org_khronos_nn_extension_activation_layer_4_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_4, "org_khronos_nn_extension_activation_layer_4", 4, (vx_reference)org_khronos_nn_extension_activation_layer_4_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_3, "org_khronos_nn_extension_convolution_layer_3", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_2_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -11087,67 +11087,67 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_5, "org_khronos_nn_extension_convolution_layer_5", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_3, "org_khronos_nn_extension_activation_layer_3", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_3_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_3, "org_khronos_nn_extension_activation_layer_3", 1, (vx_reference)org_khronos_nn_extension_activation_layer_3_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_3, "org_khronos_nn_extension_activation_layer_3", 2, (vx_reference)org_khronos_nn_extension_activation_layer_3_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_3, "org_khronos_nn_extension_activation_layer_3", 3, (vx_reference)org_khronos_nn_extension_activation_layer_3_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_3, "org_khronos_nn_extension_activation_layer_3", 4, (vx_reference)org_khronos_nn_extension_activation_layer_3_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_7, "org_khronos_nn_extension_activation_layer_7", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_7_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_7, "org_khronos_nn_extension_activation_layer_7", 1, (vx_reference)org_khronos_nn_extension_activation_layer_7_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_7, "org_khronos_nn_extension_activation_layer_7", 2, (vx_reference)org_khronos_nn_extension_activation_layer_7_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_7, "org_khronos_nn_extension_activation_layer_7", 3, (vx_reference)org_khronos_nn_extension_activation_layer_7_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_7, "org_khronos_nn_extension_activation_layer_7", 4, (vx_reference)org_khronos_nn_extension_activation_layer_7_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_5, "org_khronos_nn_extension_activation_layer_5", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_5_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_5, "org_khronos_nn_extension_activation_layer_5", 1, (vx_reference)org_khronos_nn_extension_activation_layer_5_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_5, "org_khronos_nn_extension_activation_layer_5", 2, (vx_reference)org_khronos_nn_extension_activation_layer_5_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_5, "org_khronos_nn_extension_activation_layer_5", 3, (vx_reference)org_khronos_nn_extension_activation_layer_5_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_5, "org_khronos_nn_extension_activation_layer_5", 4, (vx_reference)org_khronos_nn_extension_activation_layer_5_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_14, "org_khronos_nn_extension_convolution_layer_14", 0, (vx_reference)outputAllocators_MergeTensor_0_p0);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -11255,99 +11255,99 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_10, "org_khronos_nn_extension_convolution_layer_10", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_10_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 0, (vx_reference)outputAllocators_MergeTensor_0_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_3, "org_khronos_nn_extension_pooling_layer_3", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_14, "org_khronos_nn_extension_activation_layer_14", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_14_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_14, "org_khronos_nn_extension_activation_layer_14", 1, (vx_reference)org_khronos_nn_extension_activation_layer_14_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_14, "org_khronos_nn_extension_activation_layer_14", 2, (vx_reference)org_khronos_nn_extension_activation_layer_14_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_14, "org_khronos_nn_extension_activation_layer_14", 3, (vx_reference)org_khronos_nn_extension_activation_layer_14_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_14, "org_khronos_nn_extension_activation_layer_14", 4, (vx_reference)org_khronos_nn_extension_activation_layer_14_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_12, "org_khronos_nn_extension_activation_layer_12", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_12_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_12, "org_khronos_nn_extension_activation_layer_12", 1, (vx_reference)org_khronos_nn_extension_activation_layer_12_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_12, "org_khronos_nn_extension_activation_layer_12", 2, (vx_reference)org_khronos_nn_extension_activation_layer_12_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_12, "org_khronos_nn_extension_activation_layer_12", 3, (vx_reference)org_khronos_nn_extension_activation_layer_12_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_12, "org_khronos_nn_extension_activation_layer_12", 4, (vx_reference)org_khronos_nn_extension_activation_layer_12_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_10, "org_khronos_nn_extension_activation_layer_10", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_10_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_10, "org_khronos_nn_extension_activation_layer_10", 1, (vx_reference)org_khronos_nn_extension_activation_layer_10_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_10, "org_khronos_nn_extension_activation_layer_10", 2, (vx_reference)org_khronos_nn_extension_activation_layer_10_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_10, "org_khronos_nn_extension_activation_layer_10", 3, (vx_reference)org_khronos_nn_extension_activation_layer_10_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_10, "org_khronos_nn_extension_activation_layer_10", 4, (vx_reference)org_khronos_nn_extension_activation_layer_10_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_9, "org_khronos_nn_extension_convolution_layer_9", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_3_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -11459,95 +11459,95 @@
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_9, "org_khronos_nn_extension_activation_layer_9", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_9_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_9, "org_khronos_nn_extension_activation_layer_9", 1, (vx_reference)org_khronos_nn_extension_activation_layer_9_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_9, "org_khronos_nn_extension_activation_layer_9", 2, (vx_reference)org_khronos_nn_extension_activation_layer_9_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_9, "org_khronos_nn_extension_activation_layer_9", 3, (vx_reference)org_khronos_nn_extension_activation_layer_9_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_9, "org_khronos_nn_extension_activation_layer_9", 4, (vx_reference)org_khronos_nn_extension_activation_layer_9_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_13, "org_khronos_nn_extension_activation_layer_13", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_13_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_13, "org_khronos_nn_extension_activation_layer_13", 1, (vx_reference)org_khronos_nn_extension_activation_layer_13_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_13, "org_khronos_nn_extension_activation_layer_13", 2, (vx_reference)org_khronos_nn_extension_activation_layer_13_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_13, "org_khronos_nn_extension_activation_layer_13", 3, (vx_reference)org_khronos_nn_extension_activation_layer_13_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_13, "org_khronos_nn_extension_activation_layer_13", 4, (vx_reference)org_khronos_nn_extension_activation_layer_13_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_11, "org_khronos_nn_extension_activation_layer_11", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_11_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_11, "org_khronos_nn_extension_activation_layer_11", 1, (vx_reference)org_khronos_nn_extension_activation_layer_11_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_11, "org_khronos_nn_extension_activation_layer_11", 2, (vx_reference)org_khronos_nn_extension_activation_layer_11_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_11, "org_khronos_nn_extension_activation_layer_11", 3, (vx_reference)org_khronos_nn_extension_activation_layer_11_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_11, "org_khronos_nn_extension_activation_layer_11", 4, (vx_reference)org_khronos_nn_extension_activation_layer_11_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 0, (vx_reference)outputAllocators_MergeTensor_1_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_4, "org_khronos_nn_extension_pooling_layer_4", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_20, "org_khronos_nn_extension_convolution_layer_20", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -11655,99 +11655,99 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_16, "org_khronos_nn_extension_convolution_layer_16", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_16_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_4_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_5, "org_khronos_nn_extension_pooling_layer_5", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_20, "org_khronos_nn_extension_activation_layer_20", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_20_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_20, "org_khronos_nn_extension_activation_layer_20", 1, (vx_reference)org_khronos_nn_extension_activation_layer_20_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_20, "org_khronos_nn_extension_activation_layer_20", 2, (vx_reference)org_khronos_nn_extension_activation_layer_20_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_20, "org_khronos_nn_extension_activation_layer_20", 3, (vx_reference)org_khronos_nn_extension_activation_layer_20_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_20, "org_khronos_nn_extension_activation_layer_20", 4, (vx_reference)org_khronos_nn_extension_activation_layer_20_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_18, "org_khronos_nn_extension_activation_layer_18", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_18_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_18, "org_khronos_nn_extension_activation_layer_18", 1, (vx_reference)org_khronos_nn_extension_activation_layer_18_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_18, "org_khronos_nn_extension_activation_layer_18", 2, (vx_reference)org_khronos_nn_extension_activation_layer_18_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_18, "org_khronos_nn_extension_activation_layer_18", 3, (vx_reference)org_khronos_nn_extension_activation_layer_18_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_18, "org_khronos_nn_extension_activation_layer_18", 4, (vx_reference)org_khronos_nn_extension_activation_layer_18_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_16, "org_khronos_nn_extension_activation_layer_16", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_16_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_16, "org_khronos_nn_extension_activation_layer_16", 1, (vx_reference)org_khronos_nn_extension_activation_layer_16_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_16, "org_khronos_nn_extension_activation_layer_16", 2, (vx_reference)org_khronos_nn_extension_activation_layer_16_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_16, "org_khronos_nn_extension_activation_layer_16", 3, (vx_reference)org_khronos_nn_extension_activation_layer_16_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_16, "org_khronos_nn_extension_activation_layer_16", 4, (vx_reference)org_khronos_nn_extension_activation_layer_16_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_15, "org_khronos_nn_extension_convolution_layer_15", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_5_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -11855,67 +11855,67 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_17, "org_khronos_nn_extension_convolution_layer_17", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_17_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_15, "org_khronos_nn_extension_activation_layer_15", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_15_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_15, "org_khronos_nn_extension_activation_layer_15", 1, (vx_reference)org_khronos_nn_extension_activation_layer_15_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_15, "org_khronos_nn_extension_activation_layer_15", 2, (vx_reference)org_khronos_nn_extension_activation_layer_15_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_15, "org_khronos_nn_extension_activation_layer_15", 3, (vx_reference)org_khronos_nn_extension_activation_layer_15_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_15, "org_khronos_nn_extension_activation_layer_15", 4, (vx_reference)org_khronos_nn_extension_activation_layer_15_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_19, "org_khronos_nn_extension_activation_layer_19", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_19_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_19, "org_khronos_nn_extension_activation_layer_19", 1, (vx_reference)org_khronos_nn_extension_activation_layer_19_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_19, "org_khronos_nn_extension_activation_layer_19", 2, (vx_reference)org_khronos_nn_extension_activation_layer_19_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_19, "org_khronos_nn_extension_activation_layer_19", 3, (vx_reference)org_khronos_nn_extension_activation_layer_19_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_19, "org_khronos_nn_extension_activation_layer_19", 4, (vx_reference)org_khronos_nn_extension_activation_layer_19_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_17, "org_khronos_nn_extension_activation_layer_17", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_17_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_17, "org_khronos_nn_extension_activation_layer_17", 1, (vx_reference)org_khronos_nn_extension_activation_layer_17_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_17, "org_khronos_nn_extension_activation_layer_17", 2, (vx_reference)org_khronos_nn_extension_activation_layer_17_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_17, "org_khronos_nn_extension_activation_layer_17", 3, (vx_reference)org_khronos_nn_extension_activation_layer_17_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_17, "org_khronos_nn_extension_activation_layer_17", 4, (vx_reference)org_khronos_nn_extension_activation_layer_17_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_26, "org_khronos_nn_extension_convolution_layer_26", 0, (vx_reference)outputAllocators_MergeTensor_2_p0);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -12023,99 +12023,99 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_22, "org_khronos_nn_extension_convolution_layer_22", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_22_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 0, (vx_reference)outputAllocators_MergeTensor_2_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_6, "org_khronos_nn_extension_pooling_layer_6", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_26, "org_khronos_nn_extension_activation_layer_26", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_26_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_26, "org_khronos_nn_extension_activation_layer_26", 1, (vx_reference)org_khronos_nn_extension_activation_layer_26_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_26, "org_khronos_nn_extension_activation_layer_26", 2, (vx_reference)org_khronos_nn_extension_activation_layer_26_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_26, "org_khronos_nn_extension_activation_layer_26", 3, (vx_reference)org_khronos_nn_extension_activation_layer_26_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_26, "org_khronos_nn_extension_activation_layer_26", 4, (vx_reference)org_khronos_nn_extension_activation_layer_26_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_24, "org_khronos_nn_extension_activation_layer_24", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_24_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_24, "org_khronos_nn_extension_activation_layer_24", 1, (vx_reference)org_khronos_nn_extension_activation_layer_24_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_24, "org_khronos_nn_extension_activation_layer_24", 2, (vx_reference)org_khronos_nn_extension_activation_layer_24_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_24, "org_khronos_nn_extension_activation_layer_24", 3, (vx_reference)org_khronos_nn_extension_activation_layer_24_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_24, "org_khronos_nn_extension_activation_layer_24", 4, (vx_reference)org_khronos_nn_extension_activation_layer_24_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_22, "org_khronos_nn_extension_activation_layer_22", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_22_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_22, "org_khronos_nn_extension_activation_layer_22", 1, (vx_reference)org_khronos_nn_extension_activation_layer_22_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_22, "org_khronos_nn_extension_activation_layer_22", 2, (vx_reference)org_khronos_nn_extension_activation_layer_22_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_22, "org_khronos_nn_extension_activation_layer_22", 3, (vx_reference)org_khronos_nn_extension_activation_layer_22_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_22, "org_khronos_nn_extension_activation_layer_22", 4, (vx_reference)org_khronos_nn_extension_activation_layer_22_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_21, "org_khronos_nn_extension_convolution_layer_21", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_6_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -12223,67 +12223,67 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_23, "org_khronos_nn_extension_convolution_layer_23", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_23_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_21, "org_khronos_nn_extension_activation_layer_21", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_21_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_21, "org_khronos_nn_extension_activation_layer_21", 1, (vx_reference)org_khronos_nn_extension_activation_layer_21_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_21, "org_khronos_nn_extension_activation_layer_21", 2, (vx_reference)org_khronos_nn_extension_activation_layer_21_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_21, "org_khronos_nn_extension_activation_layer_21", 3, (vx_reference)org_khronos_nn_extension_activation_layer_21_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_21, "org_khronos_nn_extension_activation_layer_21", 4, (vx_reference)org_khronos_nn_extension_activation_layer_21_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_25, "org_khronos_nn_extension_activation_layer_25", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_25_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_25, "org_khronos_nn_extension_activation_layer_25", 1, (vx_reference)org_khronos_nn_extension_activation_layer_25_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_25, "org_khronos_nn_extension_activation_layer_25", 2, (vx_reference)org_khronos_nn_extension_activation_layer_25_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_25, "org_khronos_nn_extension_activation_layer_25", 3, (vx_reference)org_khronos_nn_extension_activation_layer_25_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_25, "org_khronos_nn_extension_activation_layer_25", 4, (vx_reference)org_khronos_nn_extension_activation_layer_25_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_23, "org_khronos_nn_extension_activation_layer_23", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_23_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_23, "org_khronos_nn_extension_activation_layer_23", 1, (vx_reference)org_khronos_nn_extension_activation_layer_23_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_23, "org_khronos_nn_extension_activation_layer_23", 2, (vx_reference)org_khronos_nn_extension_activation_layer_23_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_23, "org_khronos_nn_extension_activation_layer_23", 3, (vx_reference)org_khronos_nn_extension_activation_layer_23_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_23, "org_khronos_nn_extension_activation_layer_23", 4, (vx_reference)org_khronos_nn_extension_activation_layer_23_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_32, "org_khronos_nn_extension_convolution_layer_32", 0, (vx_reference)outputAllocators_MergeTensor_3_p0);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -12391,99 +12391,99 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_28, "org_khronos_nn_extension_convolution_layer_28", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_28_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 0, (vx_reference)outputAllocators_MergeTensor_3_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_7, "org_khronos_nn_extension_pooling_layer_7", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_32, "org_khronos_nn_extension_activation_layer_32", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_32_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_32, "org_khronos_nn_extension_activation_layer_32", 1, (vx_reference)org_khronos_nn_extension_activation_layer_32_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_32, "org_khronos_nn_extension_activation_layer_32", 2, (vx_reference)org_khronos_nn_extension_activation_layer_32_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_32, "org_khronos_nn_extension_activation_layer_32", 3, (vx_reference)org_khronos_nn_extension_activation_layer_32_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_32, "org_khronos_nn_extension_activation_layer_32", 4, (vx_reference)org_khronos_nn_extension_activation_layer_32_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_30, "org_khronos_nn_extension_activation_layer_30", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_30_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_30, "org_khronos_nn_extension_activation_layer_30", 1, (vx_reference)org_khronos_nn_extension_activation_layer_30_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_30, "org_khronos_nn_extension_activation_layer_30", 2, (vx_reference)org_khronos_nn_extension_activation_layer_30_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_30, "org_khronos_nn_extension_activation_layer_30", 3, (vx_reference)org_khronos_nn_extension_activation_layer_30_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_30, "org_khronos_nn_extension_activation_layer_30", 4, (vx_reference)org_khronos_nn_extension_activation_layer_30_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_28, "org_khronos_nn_extension_activation_layer_28", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_28_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_28, "org_khronos_nn_extension_activation_layer_28", 1, (vx_reference)org_khronos_nn_extension_activation_layer_28_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_28, "org_khronos_nn_extension_activation_layer_28", 2, (vx_reference)org_khronos_nn_extension_activation_layer_28_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_28, "org_khronos_nn_extension_activation_layer_28", 3, (vx_reference)org_khronos_nn_extension_activation_layer_28_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_28, "org_khronos_nn_extension_activation_layer_28", 4, (vx_reference)org_khronos_nn_extension_activation_layer_28_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_27, "org_khronos_nn_extension_convolution_layer_27", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_7_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -12591,67 +12591,67 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_29, "org_khronos_nn_extension_convolution_layer_29", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_29_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_27, "org_khronos_nn_extension_activation_layer_27", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_27_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_27, "org_khronos_nn_extension_activation_layer_27", 1, (vx_reference)org_khronos_nn_extension_activation_layer_27_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_27, "org_khronos_nn_extension_activation_layer_27", 2, (vx_reference)org_khronos_nn_extension_activation_layer_27_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_27, "org_khronos_nn_extension_activation_layer_27", 3, (vx_reference)org_khronos_nn_extension_activation_layer_27_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_27, "org_khronos_nn_extension_activation_layer_27", 4, (vx_reference)org_khronos_nn_extension_activation_layer_27_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_31, "org_khronos_nn_extension_activation_layer_31", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_31_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_31, "org_khronos_nn_extension_activation_layer_31", 1, (vx_reference)org_khronos_nn_extension_activation_layer_31_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_31, "org_khronos_nn_extension_activation_layer_31", 2, (vx_reference)org_khronos_nn_extension_activation_layer_31_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_31, "org_khronos_nn_extension_activation_layer_31", 3, (vx_reference)org_khronos_nn_extension_activation_layer_31_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_31, "org_khronos_nn_extension_activation_layer_31", 4, (vx_reference)org_khronos_nn_extension_activation_layer_31_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_29, "org_khronos_nn_extension_activation_layer_29", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_29_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_29, "org_khronos_nn_extension_activation_layer_29", 1, (vx_reference)org_khronos_nn_extension_activation_layer_29_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_29, "org_khronos_nn_extension_activation_layer_29", 2, (vx_reference)org_khronos_nn_extension_activation_layer_29_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_29, "org_khronos_nn_extension_activation_layer_29", 3, (vx_reference)org_khronos_nn_extension_activation_layer_29_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_29, "org_khronos_nn_extension_activation_layer_29", 4, (vx_reference)org_khronos_nn_extension_activation_layer_29_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_38, "org_khronos_nn_extension_convolution_layer_38", 0, (vx_reference)outputAllocators_MergeTensor_4_p0);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -12759,99 +12759,99 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_34, "org_khronos_nn_extension_convolution_layer_34", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_34_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 0, (vx_reference)outputAllocators_MergeTensor_4_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_8, "org_khronos_nn_extension_pooling_layer_8", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_38, "org_khronos_nn_extension_activation_layer_38", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_38_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_38, "org_khronos_nn_extension_activation_layer_38", 1, (vx_reference)org_khronos_nn_extension_activation_layer_38_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_38, "org_khronos_nn_extension_activation_layer_38", 2, (vx_reference)org_khronos_nn_extension_activation_layer_38_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_38, "org_khronos_nn_extension_activation_layer_38", 3, (vx_reference)org_khronos_nn_extension_activation_layer_38_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_38, "org_khronos_nn_extension_activation_layer_38", 4, (vx_reference)org_khronos_nn_extension_activation_layer_38_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_36, "org_khronos_nn_extension_activation_layer_36", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_36_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_36, "org_khronos_nn_extension_activation_layer_36", 1, (vx_reference)org_khronos_nn_extension_activation_layer_36_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_36, "org_khronos_nn_extension_activation_layer_36", 2, (vx_reference)org_khronos_nn_extension_activation_layer_36_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_36, "org_khronos_nn_extension_activation_layer_36", 3, (vx_reference)org_khronos_nn_extension_activation_layer_36_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_36, "org_khronos_nn_extension_activation_layer_36", 4, (vx_reference)org_khronos_nn_extension_activation_layer_36_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_34, "org_khronos_nn_extension_activation_layer_34", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_34_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_34, "org_khronos_nn_extension_activation_layer_34", 1, (vx_reference)org_khronos_nn_extension_activation_layer_34_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_34, "org_khronos_nn_extension_activation_layer_34", 2, (vx_reference)org_khronos_nn_extension_activation_layer_34_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_34, "org_khronos_nn_extension_activation_layer_34", 3, (vx_reference)org_khronos_nn_extension_activation_layer_34_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_34, "org_khronos_nn_extension_activation_layer_34", 4, (vx_reference)org_khronos_nn_extension_activation_layer_34_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_33, "org_khronos_nn_extension_convolution_layer_33", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_8_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -12963,63 +12963,63 @@
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_33, "org_khronos_nn_extension_activation_layer_33", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_33_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_33, "org_khronos_nn_extension_activation_layer_33", 1, (vx_reference)org_khronos_nn_extension_activation_layer_33_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_33, "org_khronos_nn_extension_activation_layer_33", 2, (vx_reference)org_khronos_nn_extension_activation_layer_33_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_33, "org_khronos_nn_extension_activation_layer_33", 3, (vx_reference)org_khronos_nn_extension_activation_layer_33_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_33, "org_khronos_nn_extension_activation_layer_33", 4, (vx_reference)org_khronos_nn_extension_activation_layer_33_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_37, "org_khronos_nn_extension_activation_layer_37", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_37_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_37, "org_khronos_nn_extension_activation_layer_37", 1, (vx_reference)org_khronos_nn_extension_activation_layer_37_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_37, "org_khronos_nn_extension_activation_layer_37", 2, (vx_reference)org_khronos_nn_extension_activation_layer_37_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_37, "org_khronos_nn_extension_activation_layer_37", 3, (vx_reference)org_khronos_nn_extension_activation_layer_37_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_37, "org_khronos_nn_extension_activation_layer_37", 4, (vx_reference)org_khronos_nn_extension_activation_layer_37_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_35, "org_khronos_nn_extension_activation_layer_35", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_35_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_35, "org_khronos_nn_extension_activation_layer_35", 1, (vx_reference)org_khronos_nn_extension_activation_layer_35_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_35, "org_khronos_nn_extension_activation_layer_35", 2, (vx_reference)org_khronos_nn_extension_activation_layer_35_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_35, "org_khronos_nn_extension_activation_layer_35", 3, (vx_reference)org_khronos_nn_extension_activation_layer_35_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_35, "org_khronos_nn_extension_activation_layer_35", 4, (vx_reference)org_khronos_nn_extension_activation_layer_35_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_44, "org_khronos_nn_extension_convolution_layer_44", 0, (vx_reference)outputAllocators_MergeTensor_5_p0);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -13131,95 +13131,95 @@
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 0, (vx_reference)outputAllocators_MergeTensor_5_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_9, "org_khronos_nn_extension_pooling_layer_9", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_44, "org_khronos_nn_extension_activation_layer_44", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_44_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_44, "org_khronos_nn_extension_activation_layer_44", 1, (vx_reference)org_khronos_nn_extension_activation_layer_44_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_44, "org_khronos_nn_extension_activation_layer_44", 2, (vx_reference)org_khronos_nn_extension_activation_layer_44_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_44, "org_khronos_nn_extension_activation_layer_44", 3, (vx_reference)org_khronos_nn_extension_activation_layer_44_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_44, "org_khronos_nn_extension_activation_layer_44", 4, (vx_reference)org_khronos_nn_extension_activation_layer_44_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_42, "org_khronos_nn_extension_activation_layer_42", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_42_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_42, "org_khronos_nn_extension_activation_layer_42", 1, (vx_reference)org_khronos_nn_extension_activation_layer_42_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_42, "org_khronos_nn_extension_activation_layer_42", 2, (vx_reference)org_khronos_nn_extension_activation_layer_42_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_42, "org_khronos_nn_extension_activation_layer_42", 3, (vx_reference)org_khronos_nn_extension_activation_layer_42_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_42, "org_khronos_nn_extension_activation_layer_42", 4, (vx_reference)org_khronos_nn_extension_activation_layer_42_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_40, "org_khronos_nn_extension_activation_layer_40", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_40_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_40, "org_khronos_nn_extension_activation_layer_40", 1, (vx_reference)org_khronos_nn_extension_activation_layer_40_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_40, "org_khronos_nn_extension_activation_layer_40", 2, (vx_reference)org_khronos_nn_extension_activation_layer_40_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_40, "org_khronos_nn_extension_activation_layer_40", 3, (vx_reference)org_khronos_nn_extension_activation_layer_40_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_40, "org_khronos_nn_extension_activation_layer_40", 4, (vx_reference)org_khronos_nn_extension_activation_layer_40_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_39, "org_khronos_nn_extension_convolution_layer_39", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_9_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -13331,95 +13331,95 @@
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_39, "org_khronos_nn_extension_activation_layer_39", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_39_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_39, "org_khronos_nn_extension_activation_layer_39", 1, (vx_reference)org_khronos_nn_extension_activation_layer_39_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_39, "org_khronos_nn_extension_activation_layer_39", 2, (vx_reference)org_khronos_nn_extension_activation_layer_39_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_39, "org_khronos_nn_extension_activation_layer_39", 3, (vx_reference)org_khronos_nn_extension_activation_layer_39_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_39, "org_khronos_nn_extension_activation_layer_39", 4, (vx_reference)org_khronos_nn_extension_activation_layer_39_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_43, "org_khronos_nn_extension_activation_layer_43", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_43_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_43, "org_khronos_nn_extension_activation_layer_43", 1, (vx_reference)org_khronos_nn_extension_activation_layer_43_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_43, "org_khronos_nn_extension_activation_layer_43", 2, (vx_reference)org_khronos_nn_extension_activation_layer_43_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_43, "org_khronos_nn_extension_activation_layer_43", 3, (vx_reference)org_khronos_nn_extension_activation_layer_43_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_43, "org_khronos_nn_extension_activation_layer_43", 4, (vx_reference)org_khronos_nn_extension_activation_layer_43_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_41, "org_khronos_nn_extension_activation_layer_41", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_41_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_41, "org_khronos_nn_extension_activation_layer_41", 1, (vx_reference)org_khronos_nn_extension_activation_layer_41_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_41, "org_khronos_nn_extension_activation_layer_41", 2, (vx_reference)org_khronos_nn_extension_activation_layer_41_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_41, "org_khronos_nn_extension_activation_layer_41", 3, (vx_reference)org_khronos_nn_extension_activation_layer_41_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_41, "org_khronos_nn_extension_activation_layer_41", 4, (vx_reference)org_khronos_nn_extension_activation_layer_41_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 0, (vx_reference)outputAllocators_MergeTensor_6_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_10, "org_khronos_nn_extension_pooling_layer_10", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_50, "org_khronos_nn_extension_convolution_layer_50", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -13531,95 +13531,95 @@
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_10_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_11, "org_khronos_nn_extension_pooling_layer_11", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_50, "org_khronos_nn_extension_activation_layer_50", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_50_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_50, "org_khronos_nn_extension_activation_layer_50", 1, (vx_reference)org_khronos_nn_extension_activation_layer_50_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_50, "org_khronos_nn_extension_activation_layer_50", 2, (vx_reference)org_khronos_nn_extension_activation_layer_50_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_50, "org_khronos_nn_extension_activation_layer_50", 3, (vx_reference)org_khronos_nn_extension_activation_layer_50_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_50, "org_khronos_nn_extension_activation_layer_50", 4, (vx_reference)org_khronos_nn_extension_activation_layer_50_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_48, "org_khronos_nn_extension_activation_layer_48", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_48_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_48, "org_khronos_nn_extension_activation_layer_48", 1, (vx_reference)org_khronos_nn_extension_activation_layer_48_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_48, "org_khronos_nn_extension_activation_layer_48", 2, (vx_reference)org_khronos_nn_extension_activation_layer_48_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_48, "org_khronos_nn_extension_activation_layer_48", 3, (vx_reference)org_khronos_nn_extension_activation_layer_48_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_48, "org_khronos_nn_extension_activation_layer_48", 4, (vx_reference)org_khronos_nn_extension_activation_layer_48_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_46, "org_khronos_nn_extension_activation_layer_46", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_46_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_46, "org_khronos_nn_extension_activation_layer_46", 1, (vx_reference)org_khronos_nn_extension_activation_layer_46_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_46, "org_khronos_nn_extension_activation_layer_46", 2, (vx_reference)org_khronos_nn_extension_activation_layer_46_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_46, "org_khronos_nn_extension_activation_layer_46", 3, (vx_reference)org_khronos_nn_extension_activation_layer_46_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_46, "org_khronos_nn_extension_activation_layer_46", 4, (vx_reference)org_khronos_nn_extension_activation_layer_46_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_45, "org_khronos_nn_extension_convolution_layer_45", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_11_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -13727,67 +13727,67 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_47, "org_khronos_nn_extension_convolution_layer_47", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_47_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_45, "org_khronos_nn_extension_activation_layer_45", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_45_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_45, "org_khronos_nn_extension_activation_layer_45", 1, (vx_reference)org_khronos_nn_extension_activation_layer_45_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_45, "org_khronos_nn_extension_activation_layer_45", 2, (vx_reference)org_khronos_nn_extension_activation_layer_45_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_45, "org_khronos_nn_extension_activation_layer_45", 3, (vx_reference)org_khronos_nn_extension_activation_layer_45_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_45, "org_khronos_nn_extension_activation_layer_45", 4, (vx_reference)org_khronos_nn_extension_activation_layer_45_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_49, "org_khronos_nn_extension_activation_layer_49", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_49_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_49, "org_khronos_nn_extension_activation_layer_49", 1, (vx_reference)org_khronos_nn_extension_activation_layer_49_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_49, "org_khronos_nn_extension_activation_layer_49", 2, (vx_reference)org_khronos_nn_extension_activation_layer_49_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_49, "org_khronos_nn_extension_activation_layer_49", 3, (vx_reference)org_khronos_nn_extension_activation_layer_49_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_49, "org_khronos_nn_extension_activation_layer_49", 4, (vx_reference)org_khronos_nn_extension_activation_layer_49_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_47, "org_khronos_nn_extension_activation_layer_47", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_47_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_47, "org_khronos_nn_extension_activation_layer_47", 1, (vx_reference)org_khronos_nn_extension_activation_layer_47_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_47, "org_khronos_nn_extension_activation_layer_47", 2, (vx_reference)org_khronos_nn_extension_activation_layer_47_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_47, "org_khronos_nn_extension_activation_layer_47", 3, (vx_reference)org_khronos_nn_extension_activation_layer_47_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_47, "org_khronos_nn_extension_activation_layer_47", 4, (vx_reference)org_khronos_nn_extension_activation_layer_47_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_56, "org_khronos_nn_extension_convolution_layer_56", 0, (vx_reference)outputAllocators_MergeTensor_7_p0);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -13895,99 +13895,99 @@
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_52, "org_khronos_nn_extension_convolution_layer_52", 8, (vx_reference)org_khronos_nn_extension_convolution_layer_52_p8);
 //    if(status != VX_SUCCESS)
 //        return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 0, (vx_reference)outputAllocators_MergeTensor_7_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_12, "org_khronos_nn_extension_pooling_layer_12", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_56, "org_khronos_nn_extension_activation_layer_56", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_56_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_56, "org_khronos_nn_extension_activation_layer_56", 1, (vx_reference)org_khronos_nn_extension_activation_layer_56_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_56, "org_khronos_nn_extension_activation_layer_56", 2, (vx_reference)org_khronos_nn_extension_activation_layer_56_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_56, "org_khronos_nn_extension_activation_layer_56", 3, (vx_reference)org_khronos_nn_extension_activation_layer_56_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_56, "org_khronos_nn_extension_activation_layer_56", 4, (vx_reference)org_khronos_nn_extension_activation_layer_56_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_54, "org_khronos_nn_extension_activation_layer_54", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_54_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_54, "org_khronos_nn_extension_activation_layer_54", 1, (vx_reference)org_khronos_nn_extension_activation_layer_54_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_54, "org_khronos_nn_extension_activation_layer_54", 2, (vx_reference)org_khronos_nn_extension_activation_layer_54_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_54, "org_khronos_nn_extension_activation_layer_54", 3, (vx_reference)org_khronos_nn_extension_activation_layer_54_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_54, "org_khronos_nn_extension_activation_layer_54", 4, (vx_reference)org_khronos_nn_extension_activation_layer_54_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_52, "org_khronos_nn_extension_activation_layer_52", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_52_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_52, "org_khronos_nn_extension_activation_layer_52", 1, (vx_reference)org_khronos_nn_extension_activation_layer_52_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_52, "org_khronos_nn_extension_activation_layer_52", 2, (vx_reference)org_khronos_nn_extension_activation_layer_52_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_52, "org_khronos_nn_extension_activation_layer_52", 3, (vx_reference)org_khronos_nn_extension_activation_layer_52_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_52, "org_khronos_nn_extension_activation_layer_52", 4, (vx_reference)org_khronos_nn_extension_activation_layer_52_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
 //    status = AssignNodeParameter(org_khronos_nn_extension_convolution_layer_51, "org_khronos_nn_extension_convolution_layer_51", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_12_p7);
 //    if(status != VX_SUCCESS)
 //        return status;
@@ -14099,153 +14099,154 @@
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_51, "org_khronos_nn_extension_activation_layer_51", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_51_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_51, "org_khronos_nn_extension_activation_layer_51", 1, (vx_reference)org_khronos_nn_extension_activation_layer_51_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_51, "org_khronos_nn_extension_activation_layer_51", 2, (vx_reference)org_khronos_nn_extension_activation_layer_51_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_51, "org_khronos_nn_extension_activation_layer_51", 3, (vx_reference)org_khronos_nn_extension_activation_layer_51_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_51, "org_khronos_nn_extension_activation_layer_51", 4, (vx_reference)org_khronos_nn_extension_activation_layer_51_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_55, "org_khronos_nn_extension_activation_layer_55", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_55_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_55, "org_khronos_nn_extension_activation_layer_55", 1, (vx_reference)org_khronos_nn_extension_activation_layer_55_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_55, "org_khronos_nn_extension_activation_layer_55", 2, (vx_reference)org_khronos_nn_extension_activation_layer_55_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_55, "org_khronos_nn_extension_activation_layer_55", 3, (vx_reference)org_khronos_nn_extension_activation_layer_55_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_55, "org_khronos_nn_extension_activation_layer_55", 4, (vx_reference)org_khronos_nn_extension_activation_layer_55_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_53, "org_khronos_nn_extension_activation_layer_53", 0, (vx_reference)org_khronos_nn_extension_convolution_layer_53_p8);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_53, "org_khronos_nn_extension_activation_layer_53", 1, (vx_reference)org_khronos_nn_extension_activation_layer_53_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_53, "org_khronos_nn_extension_activation_layer_53", 2, (vx_reference)org_khronos_nn_extension_activation_layer_53_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_53, "org_khronos_nn_extension_activation_layer_53", 3, (vx_reference)org_khronos_nn_extension_activation_layer_53_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_activation_layer_53, "org_khronos_nn_extension_activation_layer_53", 4, (vx_reference)org_khronos_nn_extension_activation_layer_53_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 0, (vx_reference)outputAllocators_MergeTensor_8_p0);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 1, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 2, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 3, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 4, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 5, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 6, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p6);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_pooling_layer_13, "org_khronos_nn_extension_pooling_layer_13", 7, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_fully_connected_layer_0, "org_khronos_nn_extension_fully_connected_layer_0", 0, (vx_reference)org_khronos_nn_extension_pooling_layer_13_p7);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_fully_connected_layer_0, "org_khronos_nn_extension_fully_connected_layer_0", 1, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_fully_connected_layer_0, "org_khronos_nn_extension_fully_connected_layer_0", 2, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_fully_connected_layer_0, "org_khronos_nn_extension_fully_connected_layer_0", 3, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_fully_connected_layer_0, "org_khronos_nn_extension_fully_connected_layer_0", 4, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_fully_connected_layer_0, "org_khronos_nn_extension_fully_connected_layer_0", 5, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_openvx_tensor_multiply_0, "org_khronos_openvx_tensor_multiply_0", 0, (vx_reference)org_khronos_nn_extension_fully_connected_layer_0_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_openvx_tensor_multiply_0, "org_khronos_openvx_tensor_multiply_0", 1, (vx_reference)org_khronos_openvx_tensor_multiply_0_p1);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_openvx_tensor_multiply_0, "org_khronos_openvx_tensor_multiply_0", 2, (vx_reference)org_khronos_openvx_tensor_multiply_0_p2);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_openvx_tensor_multiply_0, "org_khronos_openvx_tensor_multiply_0", 3, (vx_reference)org_khronos_openvx_tensor_multiply_0_p3);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_openvx_tensor_multiply_0, "org_khronos_openvx_tensor_multiply_0", 4, (vx_reference)org_khronos_openvx_tensor_multiply_0_p4);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_openvx_tensor_multiply_0, "org_khronos_openvx_tensor_multiply_0", 5, (vx_reference)org_khronos_openvx_tensor_multiply_0_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_softmax_layer_0, "org_khronos_nn_extension_softmax_layer_0", 0, (vx_reference)org_khronos_openvx_tensor_multiply_0_p5);
     if(status != VX_SUCCESS)
         return status;
-        
+
     status = AssignNodeParameter(org_khronos_nn_extension_softmax_layer_0, "org_khronos_nn_extension_softmax_layer_0", 1, (vx_reference)org_khronos_nn_extension_softmax_layer_0_p1);
     if(status != VX_SUCCESS)
         return status;
-        
- 
+
+
 
     return status;
 }
 #endif
+#endif//OPENVX_CONFORMANCE_NEURAL_NETWORKS
diff --git a/test_conformance/Networks/src/graph_process.c b/test_conformance/Networks/src/graph_process.c
index e05580b..37d98fc 100644
--- a/test_conformance/Networks/src/graph_process.c
+++ b/test_conformance/Networks/src/graph_process.c
@@ -1,5 +1,5 @@
 /** @file graph_process.c
- *  @brief 
+ *  @brief
  *  This file contains the implementation of the graph inputs/outputs processing functions
  */
 
@@ -127,7 +127,7 @@
 
 vx_status preprocess(vx_tensor input, const char * fName)
 {
-    //1. Load image 
+    //1. Load image
     //2. Normalize the image pixels the same way you used in the training process (i.e, mean substraction, scaling, etc)
     //3. Scale each pixel with the scale factor ModelOptimizer reported
     //4. Convert each pixel to the required precision (Q78, FP16, etc)
@@ -160,12 +160,11 @@
 
 vx_status postprocess(vx_tensor output, /*OUT*/ int* detected_class)
 {
-    //1. Find top-N probabilities indices in the output tensor. 
-    //2. Probabilities must be converted back to floating point number in order to be interpreted as percentages 
+    //1. Find top-N probabilities indices in the output tensor.
+    //2. Probabilities must be converted back to floating point number in order to be interpreted as percentages
 
     //getProbabilitiesFromMDData(...)
     vx_int16 mem[1000] = {0};
-    float prob[1000] = {0};
 
     const vx_size view_start[2] = { 0, 0 };
     const vx_size view_end[2] = { 1000, 1 };
@@ -207,18 +206,18 @@
     vx_status status = vxQueryTensor(tensor, VX_TENSOR_NUMBER_OF_DIMS, &dims_num, sizeof(dims_num));
 
     vx_size *dims = (vx_size*)malloc(dims_num * sizeof(vx_size));
-    if (!dims) 
+    if (!dims)
     {
-        fclose(f); 
-        return VX_ERROR_NO_MEMORY; 
+        fclose(f);
+        return VX_ERROR_NO_MEMORY;
     }
 
     status = vxQueryTensor(tensor, VX_TENSOR_DIMS, dims, sizeof(vx_size) * dims_num);
-    if (status != VX_SUCCESS) 
+    if (status != VX_SUCCESS)
     {
-        fclose(f); 
+        fclose(f);
         free(dims);
-        return status; 
+        return status;
     }
 
     vx_size count = 1;
@@ -270,6 +269,6 @@
     }
 
     fclose(f);
-    
+
     return VX_SUCCESS;
 }
diff --git a/test_conformance/Networks/src/precisionConverter.c b/test_conformance/Networks/src/precisionConverter.c
index 702c2de..9dfeaff 100644
--- a/test_conformance/Networks/src/precisionConverter.c
+++ b/test_conformance/Networks/src/precisionConverter.c
@@ -11,7 +11,8 @@
 //small helper function to represent uint32_t value as float32
 float asfloat(uint32_t v)
 {
-    return *(float*)&v;
+    unsigned long value = (unsigned long)(void *)&v;
+    return *(float*)value;
 }
 
 
@@ -85,7 +86,7 @@
     return v.u | s;
 }
 
-/** @brief Converts FP16 to FP32 
+/** @brief Converts FP16 to FP32
 *  @param x - value in FP16 format
 *  @return value in FP32 format
 **************************************************************/
@@ -135,7 +136,7 @@
     return asfloat(u);
 }
 
-/** @brief Converts S16 (signed int16) to a float 
+/** @brief Converts S16 (signed int16) to a float
 *  @param s16Pixel - A pointer to a value in S16 format.
 *  @return float value
 ***************************************************************/
@@ -145,7 +146,7 @@
     return (float)value;
 }
 
-/** @brief Converts Q78 to a float 
+/** @brief Converts Q78 to a float
 *  @param q78Pixel - A pointer to a value in Q78 format.
 *  @return float value
 **************************************************************/
@@ -155,7 +156,7 @@
     return ((float)value) / 256.0;
 }
 
-/** @brief Converts FP16 to a float 
+/** @brief Converts FP16 to a float
 *  @param fp16Pixel - A pointer to a value in FP16 format.
 *  @return float value
 **************************************************************/
diff --git a/test_conformance/Networks/src/utilities.c b/test_conformance/Networks/src/utilities.c
index 7341513..65f0113 100644
--- a/test_conformance/Networks/src/utilities.c
+++ b/test_conformance/Networks/src/utilities.c
@@ -18,6 +18,7 @@
 #endif
     if (df == VX_TYPE_FLOAT32)
 		return FP32ToFloat;
+    return NULL;
 }
 
 //Local function that returns a pointer to a function that converts float to the image format
@@ -31,6 +32,7 @@
 #endif
     if (df == VX_TYPE_FLOAT32)
         return floatToFP32;
+    return NULL;
 }
 
 /** @brief Loads image from a file and converts it to float.
@@ -50,7 +52,7 @@
         WriteLog("Failed to load image from file %s", fileName);
         return NULL;
     }
-    
+
     size_t imageSize = (*width) * (*height) * (*channels);
     float* imageF = (float*) malloc((*width) * (*height) * (*channels) * sizeof(float));
     for (size_t i = 0; i < imageSize; ++i)
@@ -157,7 +159,7 @@
 	    WriteLog("Trying to load image with %d channels. Currently only images with 1 or 3 channels are supported.\n", channels);
 		return VX_FAILURE;
 	}
-	
+
 	vx_size dims_num = 0;
 	vx_size dimensionsArray[VX_MAX_TENSOR_DIMS_CT] = { 0 };
     vx_status status = vxQueryTensor(mddata, VX_TENSOR_NUMBER_OF_DIMS, &dims_num, sizeof(dims_num));
@@ -173,7 +175,7 @@
         WriteLog("MDData has less than 3 dimensions. It cannot store an image\n");
         return VX_FAILURE;
     }
-	
+
 	if (width != dimensionsArray[1] || height != dimensionsArray[0] || channels != dimensionsArray[2])
 	{
 	    WriteLog("Image size %dx%dx%d does not suit MDData size %dx%dx%d\n", width, height, channels, dimensionsArray[1], dimensionsArray[0], dimensionsArray[1]);
@@ -192,7 +194,7 @@
 	const vx_size viewStart[VX_MAX_TENSOR_DIMS_CT] = { 0 };
     mddataBasePtr = malloc(width*height*3*sizeof(vx_int16));
     if (!mddataBasePtr) { WriteLog("ERROR: malloc failed..."); return VX_FAILURE; }
-    
+
 	size_t channelsOrderFix = channels == 1 ? 0 : 2;
     void(*convertFromFloat)(float, char*) = convertFromFloatFunc(dt);
     for (size_t h = 0; h < dimensionsArray[0]; ++h)
@@ -235,12 +237,12 @@
         WriteLog("ERROR: cannot open classification file %s\n", fileFullPath);
         return NULL;
     }
-    
+
     //Get file size
     fseek(fp, 0, SEEK_END); // seek to end of file
     size_t fileSize = ftell(fp); // get current file pointer
     fseek(fp, 0, SEEK_SET); // seek back to beginning of file
-    
+
     char* fileContent = (char*)malloc(fileSize + 1);
     if (fread(fileContent, 1, fileSize, fp) != fileSize)
     {
@@ -250,7 +252,7 @@
         return NULL;
     }
     fclose(fp);
-    
+
     size_t classCount = 0;
     for (size_t i = 0; i < fileSize; ++i)
     {
@@ -265,7 +267,7 @@
         fileContent[fileSize] = '\0';
         classCount++;
     }
-    
+
     char** classArray = (char**)malloc(classCount * sizeof(char*));
     size_t classIndex = 0;
     for (size_t i = 0; i < fileSize + 1; ++i)
@@ -313,7 +315,7 @@
 	    WriteLog("Error in moveHighestProbToTheBegin, received NULL pointer\n");
 		return;
 	}
-	
+
     for (size_t sortIndex = 0; sortIndex < sortNum; ++sortIndex)
     {
         size_t highProbIndex = sortIndex;
diff --git a/test_conformance/shared_functions.h b/test_conformance/shared_functions.h
index f827249..f849d06 100644
--- a/test_conformance/shared_functions.h
+++ b/test_conformance/shared_functions.h
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
diff --git a/test_conformance/test_accumulate.c b/test_conformance/test_accumulate.c
deleted file mode 100644
index 164dc87..0000000
--- a/test_conformance/test_accumulate.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/* 
-
- * Copyright (c) 2012-2017 The Khronos Group Inc.
- *
- * 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 "test_engine/test.h"
-#include <VX/vx.h>
-#include <VX/vxu.h>
-
-
-TESTCASE(Accumulate, CT_VXContext, ct_setup_vx_context, 0)
-
-
-TEST(Accumulate, testNodeCreation)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input = 0, accum = 0;
-    vx_graph graph = 0;
-    vx_node node = 0;
-
-    ASSERT_VX_OBJECT(input = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum = vxCreateImage(context, 128, 128, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
-
-    graph = vxCreateGraph(context);
-    ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
-
-    ASSERT_VX_OBJECT(node = vxAccumulateImageNode(graph, input, accum), VX_TYPE_NODE);
-
-    VX_CALL(vxVerifyGraph(graph));
-
-    VX_CALL(vxReleaseNode(&node));
-    VX_CALL(vxReleaseGraph(&graph));
-    VX_CALL(vxReleaseImage(&accum));
-    VX_CALL(vxReleaseImage(&input));
-
-    ASSERT(node == 0);
-    ASSERT(graph == 0);
-    ASSERT(accum == 0);
-    ASSERT(input == 0);
-}
-
-
-static CT_Image accumulate_generate_random_8u(int width, int height)
-{
-    CT_Image image;
-
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));
-
-    return image;
-}
-
-
-static CT_Image accumulate_generate_random_16s(int width, int height)
-{
-    CT_Image image;
-
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_S16, &CT()->seed_, -32768, 32768));
-
-    return image;
-}
-
-
-static void accumulate_reference(CT_Image input, CT_Image accum)
-{
-    CT_FILL_IMAGE_16S(return, accum,
-            {
-                uint8_t* input_data = CT_IMAGE_DATA_PTR_8U(input, x, y);
-                int32_t res32 = ((int32_t)(*dst_data)) + ((int32_t)(*input_data));
-                int16_t res = CT_SATURATE_S16(res32);
-                *dst_data = res;
-            });
-}
-
-
-static void accumulate_check(CT_Image input, CT_Image accum_src, CT_Image accum_dst)
-{
-    CT_Image accum_ref = NULL;
-
-    ASSERT(input && accum_src && accum_dst);
-
-    ASSERT_NO_FAILURE(accum_ref = ct_image_create_clone(accum_src));
-
-    ASSERT_NO_FAILURE(accumulate_reference(input, accum_ref));
-
-    EXPECT_EQ_CTIMAGE(accum_ref, accum_dst);
-#if 0
-    if (CT_HasFailure())
-    {
-        printf("=== Input ===\n");
-        ct_dump_image_info(input);
-        printf("=== Accum source ===\n");
-        ct_dump_image_info(accum_src);
-        printf("=== Accum RESULT ===\n");
-        ct_dump_image_info(accum_dst);
-        printf("=== EXPECTED RESULT ===\n");
-        ct_dump_image_info(accum_ref);
-    }
-#endif
-}
-
-typedef struct {
-    const char* testName;
-    int dummy_;
-    int width, height;
-} Arg;
-
-
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ARG, 0)
-
-TEST_WITH_ARG(Accumulate, testGraphProcessing, Arg,
-    PARAMETERS
-)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input_image = 0, accum_image = 0;
-    vx_graph graph = 0;
-    vx_node node = 0;
-
-    CT_Image input = NULL, accum_src = NULL, accum_dst = NULL;
-
-    ASSERT_NO_FAILURE(input = accumulate_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_NO_FAILURE(accum_src = accumulate_generate_random_16s(arg_->width, arg_->height));
-
-    ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum_image = ct_image_to_vx_image(accum_src, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-
-    ASSERT_VX_OBJECT(node = vxAccumulateImageNode(graph, input_image, accum_image), VX_TYPE_NODE);
-
-    VX_CALL(vxVerifyGraph(graph));
-    VX_CALL(vxProcessGraph(graph));
-
-    ASSERT_NO_FAILURE(accum_dst = ct_image_from_vx_image(accum_image));
-
-    ASSERT_NO_FAILURE(accumulate_check(input, accum_src, accum_dst));
-
-    VX_CALL(vxReleaseNode(&node));
-    VX_CALL(vxReleaseGraph(&graph));
-
-    ASSERT(node == 0);
-    ASSERT(graph == 0);
-
-    VX_CALL(vxReleaseImage(&accum_image));
-    VX_CALL(vxReleaseImage(&input_image));
-
-    ASSERT(accum_image == 0);
-    ASSERT(input_image == 0);
-}
-
-TEST_WITH_ARG(Accumulate, testImmediateProcessing, Arg,
-    PARAMETERS
-)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input_image = 0, accum_image = 0;
-
-    CT_Image input = NULL, accum_src = NULL, accum_dst = NULL;
-
-    ASSERT_NO_FAILURE(input = accumulate_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_NO_FAILURE(accum_src = accumulate_generate_random_16s(arg_->width, arg_->height));
-
-    ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum_image = ct_image_to_vx_image(accum_src, context), VX_TYPE_IMAGE);
-
-    VX_CALL(vxuAccumulateImage(context, input_image, accum_image));
-
-    ASSERT_NO_FAILURE(accum_dst = ct_image_from_vx_image(accum_image));
-
-    ASSERT_NO_FAILURE(accumulate_check(input, accum_src, accum_dst));
-
-    VX_CALL(vxReleaseImage(&accum_image));
-    VX_CALL(vxReleaseImage(&input_image));
-
-    ASSERT(accum_image == 0);
-    ASSERT(input_image == 0);
-}
-
-TESTCASE_TESTS(Accumulate,
-        testNodeCreation,
-        testGraphProcessing,
-        testImmediateProcessing
-)
diff --git a/test_conformance/test_accumulatesquare.c b/test_conformance/test_accumulatesquare.c
deleted file mode 100644
index 6f4fa69..0000000
--- a/test_conformance/test_accumulatesquare.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* 
-
- * Copyright (c) 2012-2017 The Khronos Group Inc.
- *
- * 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 "test_engine/test.h"
-#include <VX/vx.h>
-#include <VX/vxu.h>
-
-
-TESTCASE(AccumulateSquare, CT_VXContext, ct_setup_vx_context, 0)
-
-
-TEST(AccumulateSquare, testNodeCreation)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input = 0, accum = 0;
-    vx_uint32 shift = 8;
-    vx_scalar shift_scalar = 0;
-    vx_graph graph = 0;
-    vx_node node = 0;
-
-    ASSERT_VX_OBJECT(input = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum = vxCreateImage(context, 128, 128, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(shift_scalar = vxCreateScalar(context, VX_TYPE_UINT32, &shift), VX_TYPE_SCALAR);
-
-    graph = vxCreateGraph(context);
-    ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
-
-    ASSERT_VX_OBJECT(node = vxAccumulateSquareImageNode(graph, input, shift_scalar, accum), VX_TYPE_NODE);
-
-    VX_CALL(vxVerifyGraph(graph));
-
-    VX_CALL(vxReleaseNode(&node));
-    VX_CALL(vxReleaseGraph(&graph));
-    VX_CALL(vxReleaseImage(&accum));
-    VX_CALL(vxReleaseImage(&input));
-    VX_CALL(vxReleaseScalar(&shift_scalar));
-
-    ASSERT(node == 0);
-    ASSERT(graph == 0);
-    ASSERT(accum == 0);
-    ASSERT(input == 0);
-}
-
-
-static CT_Image accumulate_square_generate_random_8u(int width, int height)
-{
-    CT_Image image;
-
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));
-
-    return image;
-}
-
-
-static CT_Image accumulate_square_generate_random_16s_non_negative(int width, int height)
-{
-    CT_Image image;
-
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_S16, &CT()->seed_, 0, 32768));
-
-    return image;
-}
-
-
-static void accumulate_square_reference(CT_Image input, vx_uint32 shift, CT_Image accum)
-{
-    CT_FILL_IMAGE_16S(return, accum,
-            {
-                uint8_t* input_data = CT_IMAGE_DATA_PTR_8U(input, x, y);
-                int32_t res32 = ((int32_t)(*dst_data)) + ((((int32_t)(*input_data))*((int32_t)(*input_data))) >> shift);
-                int16_t res = CT_SATURATE_S16(res32);
-                *dst_data = res;
-            });
-}
-
-
-static void accumulate_square_check(CT_Image input, vx_uint32 shift, CT_Image accum_src, CT_Image accum_dst)
-{
-    CT_Image accum_ref = NULL;
-
-    ASSERT(input && accum_src && accum_dst);
-
-    ASSERT_NO_FAILURE(accum_ref = ct_image_create_clone(accum_src));
-
-    ASSERT_NO_FAILURE(accumulate_square_reference(input, shift, accum_ref));
-
-    EXPECT_EQ_CTIMAGE(accum_ref, accum_dst);
-#if 0
-    if (CT_HasFailure())
-    {
-        printf("=== Input ===\n");
-        ct_dump_image_info(input);
-        printf("=== Accum source ===\n");
-        ct_dump_image_info(accum_src);
-        printf("=== Accum RESULT ===\n");
-        ct_dump_image_info(accum_dst);
-        printf("=== EXPECTED RESULT ===\n");
-        ct_dump_image_info(accum_ref);
-    }
-#endif
-}
-
-typedef struct {
-    const char* testName;
-    vx_uint32 shift;
-    int width, height;
-} Arg;
-
-
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random/shift0", ADD_SIZE_SMALL_SET, ARG, 0), \
-    CT_GENERATE_PARAMETERS("random/shift1", ADD_SIZE_SMALL_SET, ARG, 1), \
-    CT_GENERATE_PARAMETERS("random/shift8", ADD_SIZE_SMALL_SET, ARG, 8), \
-    CT_GENERATE_PARAMETERS("random/shift15", ADD_SIZE_SMALL_SET, ARG, 15)
-
-TEST_WITH_ARG(AccumulateSquare, testGraphProcessing, Arg,
-    PARAMETERS
-)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input_image = 0, accum_image = 0;
-    vx_scalar shift_scalar = 0;
-    vx_graph graph = 0;
-    vx_node node = 0;
-
-    CT_Image input = NULL, accum_src = NULL, accum_dst = NULL;
-
-    ASSERT_VX_OBJECT(shift_scalar = vxCreateScalar(context, VX_TYPE_UINT32, &arg_->shift), VX_TYPE_SCALAR);
-
-    ASSERT_NO_FAILURE(input = accumulate_square_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_NO_FAILURE(accum_src = accumulate_square_generate_random_16s_non_negative(arg_->width, arg_->height));
-
-    ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum_image = ct_image_to_vx_image(accum_src, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-
-    ASSERT_VX_OBJECT(node = vxAccumulateSquareImageNode(graph, input_image, shift_scalar, accum_image), VX_TYPE_NODE);
-
-    VX_CALL(vxVerifyGraph(graph));
-    VX_CALL(vxProcessGraph(graph));
-
-    ASSERT_NO_FAILURE(accum_dst = ct_image_from_vx_image(accum_image));
-
-    ASSERT_NO_FAILURE(accumulate_square_check(input, arg_->shift, accum_src, accum_dst));
-
-    VX_CALL(vxReleaseNode(&node));
-    VX_CALL(vxReleaseGraph(&graph));
-
-    ASSERT(node == 0);
-    ASSERT(graph == 0);
-
-    VX_CALL(vxReleaseImage(&accum_image));
-    VX_CALL(vxReleaseImage(&input_image));
-    VX_CALL(vxReleaseScalar(&shift_scalar));
-
-    ASSERT(accum_image == 0);
-    ASSERT(input_image == 0);
-}
-
-TEST_WITH_ARG(AccumulateSquare, testImmediateProcessing, Arg,
-    PARAMETERS
-)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input_image = 0, accum_image = 0;
-    vx_scalar shift_scalar = 0;
-
-    CT_Image input = NULL, accum_src = NULL, accum_dst = NULL;
-
-    ASSERT_VX_OBJECT(shift_scalar = vxCreateScalar(context, VX_TYPE_UINT32, &arg_->shift), VX_TYPE_SCALAR);
-
-    ASSERT_NO_FAILURE(input = accumulate_square_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_NO_FAILURE(accum_src = accumulate_square_generate_random_16s_non_negative(arg_->width, arg_->height));
-
-    ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum_image = ct_image_to_vx_image(accum_src, context), VX_TYPE_IMAGE);
-
-    VX_CALL(vxuAccumulateSquareImage(context, input_image, shift_scalar, accum_image));
-
-    ASSERT_NO_FAILURE(accum_dst = ct_image_from_vx_image(accum_image));
-
-    ASSERT_NO_FAILURE(accumulate_square_check(input, arg_->shift, accum_src, accum_dst));
-
-    VX_CALL(vxReleaseImage(&accum_image));
-    VX_CALL(vxReleaseImage(&input_image));
-    VX_CALL(vxReleaseScalar(&shift_scalar));
-
-    ASSERT(accum_image == 0);
-    ASSERT(input_image == 0);
-}
-
-TESTCASE_TESTS(AccumulateSquare,
-        testNodeCreation,
-        testGraphProcessing,
-        testImmediateProcessing
-)
diff --git a/test_conformance/test_accumulateweighted.c b/test_conformance/test_accumulateweighted.c
deleted file mode 100644
index 59b7c02..0000000
--- a/test_conformance/test_accumulateweighted.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/* 
-
- * Copyright (c) 2012-2017 The Khronos Group Inc.
- *
- * 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 "test_engine/test.h"
-#include <VX/vx.h>
-#include <VX/vxu.h>
-
-
-TESTCASE(AccumulateWeighted, CT_VXContext, ct_setup_vx_context, 0)
-
-
-TEST(AccumulateWeighted, testNodeCreation)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input = 0, accum = 0;
-    vx_float32 alpha = 0.5f;
-    vx_scalar alpha_scalar = 0;
-    vx_graph graph = 0;
-    vx_node node = 0;
-
-    ASSERT_VX_OBJECT(input = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(alpha_scalar = vxCreateScalar(context, VX_TYPE_FLOAT32, &alpha), VX_TYPE_SCALAR);
-
-    graph = vxCreateGraph(context);
-    ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
-
-    ASSERT_VX_OBJECT(node = vxAccumulateWeightedImageNode(graph, input, alpha_scalar, accum), VX_TYPE_NODE);
-
-    VX_CALL(vxVerifyGraph(graph));
-
-    VX_CALL(vxReleaseNode(&node));
-    VX_CALL(vxReleaseGraph(&graph));
-    VX_CALL(vxReleaseImage(&accum));
-    VX_CALL(vxReleaseImage(&input));
-    VX_CALL(vxReleaseScalar(&alpha_scalar));
-
-    ASSERT(node == 0);
-    ASSERT(graph == 0);
-    ASSERT(accum == 0);
-    ASSERT(input == 0);
-}
-
-
-static CT_Image accumulate_weighted_generate_random_8u(int width, int height)
-{
-    CT_Image image;
-
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));
-
-    return image;
-}
-
-
-static void accumulate_weighted_reference(CT_Image input, vx_float32 alpha, CT_Image accum)
-{
-    CT_FILL_IMAGE_8U(return, accum,
-            {
-                uint8_t* input_data = CT_IMAGE_DATA_PTR_8U(input, x, y);
-                vx_float32 res = (1 - alpha) * ((vx_float32)(int32_t)(*dst_data)) + (alpha) * ((vx_float32)(int32_t)(*input_data));
-                uint8_t res8 = CT_SATURATE_U8(res);
-                *dst_data = res8;
-            });
-}
-
-
-static void accumulate_weighted_check(CT_Image input, vx_float32 alpha, CT_Image accum_src, CT_Image accum_dst)
-{
-    CT_Image accum_ref = NULL;
-
-    ASSERT(input && accum_src && accum_dst);
-
-    ASSERT_NO_FAILURE(accum_ref = ct_image_create_clone(accum_src));
-
-    ASSERT_NO_FAILURE(accumulate_weighted_reference(input, alpha, accum_ref));
-
-    EXPECT_CTIMAGE_NEAR(accum_ref, accum_dst, 1);
-#if 0
-    if (CT_HasFailure())
-    {
-        printf("=== Input ===\n");
-        ct_dump_image_info(input);
-        printf("=== Accum source ===\n");
-        ct_dump_image_info(accum_src);
-        printf("=== Accum RESULT ===\n");
-        ct_dump_image_info(accum_dst);
-        printf("=== EXPECTED RESULT ===\n");
-        ct_dump_image_info(accum_ref);
-    }
-#endif
-}
-
-typedef struct {
-    const char* testName;
-    vx_float32 alpha;
-    int width, height;
-} Arg;
-
-
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random/alpha0.5f", ADD_SIZE_SMALL_SET, ARG, 0.5f), \
-    CT_GENERATE_PARAMETERS("random/alpha0.0f", ADD_SIZE_SMALL_SET, ARG, 0.0f), \
-    CT_GENERATE_PARAMETERS("random/alpha1.0f", ADD_SIZE_SMALL_SET, ARG, 1.0f), \
-    CT_GENERATE_PARAMETERS("random/alpha0.25f", ADD_SIZE_SMALL_SET, ARG, 0.25f), \
-    CT_GENERATE_PARAMETERS("random/alpha0.95f", ADD_SIZE_SMALL_SET, ARG, 0.95f), \
-    CT_GENERATE_PARAMETERS("random/alpha0.999f", ADD_SIZE_SMALL_SET, ARG, 0.999f), \
-    CT_GENERATE_PARAMETERS("random/alpha0.001f", ADD_SIZE_SMALL_SET, ARG, 0.001f)
-
-TEST_WITH_ARG(AccumulateWeighted, testGraphProcessing, Arg,
-    PARAMETERS
-)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input_image = 0, accum_image = 0;
-    vx_scalar alpha_scalar = 0;
-    vx_graph graph = 0;
-    vx_node node = 0;
-
-    CT_Image input = NULL, accum_src = NULL, accum_dst = NULL;
-
-    ASSERT_VX_OBJECT(alpha_scalar = vxCreateScalar(context, VX_TYPE_FLOAT32, &arg_->alpha), VX_TYPE_SCALAR);
-
-    ASSERT_NO_FAILURE(input = accumulate_weighted_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_NO_FAILURE(accum_src = accumulate_weighted_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum_image = ct_image_to_vx_image(accum_src, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-
-    ASSERT_VX_OBJECT(node = vxAccumulateWeightedImageNode(graph, input_image, alpha_scalar, accum_image), VX_TYPE_NODE);
-
-    VX_CALL(vxVerifyGraph(graph));
-    VX_CALL(vxProcessGraph(graph));
-
-    ASSERT_NO_FAILURE(accum_dst = ct_image_from_vx_image(accum_image));
-
-    ASSERT_NO_FAILURE(accumulate_weighted_check(input, arg_->alpha, accum_src, accum_dst));
-
-    VX_CALL(vxReleaseNode(&node));
-    VX_CALL(vxReleaseGraph(&graph));
-
-    ASSERT(node == 0);
-    ASSERT(graph == 0);
-
-    VX_CALL(vxReleaseImage(&accum_image));
-    VX_CALL(vxReleaseImage(&input_image));
-    VX_CALL(vxReleaseScalar(&alpha_scalar));
-
-    ASSERT(accum_image == 0);
-    ASSERT(input_image == 0);
-}
-
-TEST_WITH_ARG(AccumulateWeighted, testImmediateProcessing, Arg,
-    PARAMETERS
-)
-{
-    vx_context context = context_->vx_context_;
-    vx_image input_image = 0, accum_image = 0;
-    vx_scalar alpha_scalar = 0;
-
-    CT_Image input = NULL, accum_src = NULL, accum_dst = NULL;
-
-    ASSERT_VX_OBJECT(alpha_scalar = vxCreateScalar(context, VX_TYPE_FLOAT32, &arg_->alpha), VX_TYPE_SCALAR);
-
-    ASSERT_NO_FAILURE(input = accumulate_weighted_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_NO_FAILURE(accum_src = accumulate_weighted_generate_random_8u(arg_->width, arg_->height));
-
-    ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
-
-    ASSERT_VX_OBJECT(accum_image = ct_image_to_vx_image(accum_src, context), VX_TYPE_IMAGE);
-
-    VX_CALL(vxuAccumulateWeightedImage(context, input_image, alpha_scalar, accum_image));
-
-    ASSERT_NO_FAILURE(accum_dst = ct_image_from_vx_image(accum_image));
-
-    ASSERT_NO_FAILURE(accumulate_weighted_check(input, arg_->alpha, accum_src, accum_dst));
-
-    VX_CALL(vxReleaseImage(&accum_image));
-    VX_CALL(vxReleaseImage(&input_image));
-    VX_CALL(vxReleaseScalar(&alpha_scalar));
-
-    ASSERT(accum_image == 0);
-    ASSERT(input_image == 0);
-}
-
-TESTCASE_TESTS(AccumulateWeighted,
-        testNodeCreation,
-        testGraphProcessing,
-        testImmediateProcessing
-)
diff --git a/test_conformance/test_addsub.c b/test_conformance/test_addsub.c
index dff1bd0..27e4bf3 100644
--- a/test_conformance/test_addsub.c
+++ b/test_conformance/test_addsub.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -675,3 +677,5 @@
 
 TESTCASE_TESTS(vxuAddSub, DISABLED_testNegativeFormat, DISABLED_testNegativeSizes,                testOverflowModes, testFuzzy)
 TESTCASE_TESTS(vxAddSub,  DISABLED_testNegativeFormat, DISABLED_testNegativeSizes, testInference, testOverflowModes, testFuzzy)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_array.c b/test_conformance/test_array.c
index d0ca84d..27b7af0 100644
--- a/test_conformance/test_array.c
+++ b/test_conformance/test_array.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <math.h>
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -872,3 +874,5 @@
     test_vxCopyArrayRangeRead,
     test_vxCopyArrayRangeWrite,
     test_vxMapArrayRangeWrite)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_bilateralfilter.c b/test_conformance/test_bilateralfilter.c
index 28f0597..ddfac10 100644
--- a/test_conformance/test_bilateralfilter.c
+++ b/test_conformance/test_bilateralfilter.c
@@ -14,14 +14,18 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx_types.h>
 #include <VX/vx_khr_nn.h>
+#include <VX/vxu.h>
 
 #include <assert.h>
 #include <limits.h>
 #include <math.h>
+#include <float.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -51,23 +55,6 @@
     TT_U8
 };
 
-static size_t ownGetFlatByteOffset(
-        size_t index,
-        vx_size dim_num,
-        const vx_size * in_dims,
-        const vx_size * in_strides)
-{
-    size_t res = 0;
-
-    for (vx_size d = 0; d < dim_num; ++d)
-    {
-        res += in_strides[d] * (index % in_dims[d]);
-        index /= in_dims[d];
-    }
-
-    return res;
-}
-
 static void ownUnpackFormat(
         enum TestTensorDF fmt,
         /*OUT*/ vx_enum * data_type,
@@ -112,116 +99,519 @@
     }
 }
 
+#define  COLOR_WEIGHT_SIZE_PER_CHANNEL      256
+
+static void getMinMax(const void* src, const vx_size* src_strides, const vx_size* dims, vx_size num_of_dims,
+                      vx_int16 *max_value, vx_int16 *min_value)
+{
+    vx_int16 maxVal = INT16_MIN;
+    vx_int16 minVal = INT16_MAX;
+    if (num_of_dims == 2)
+    {
+        for (vx_uint32 y = 0; y < dims[1]; y++)
+        {
+            for (vx_uint32 x = 0; x < dims[0]; x++)
+            {
+                vx_uint32 offset = y * src_strides[1] + x * src_strides[0];
+                vx_int16 val = *(vx_int16 *)((vx_int8 *)src + offset);
+                if (val > maxVal)
+                {
+                    maxVal = val;
+                }
+                if (val < minVal)
+                {
+                    minVal = val;
+                }
+            }
+        }
+        *max_value = maxVal;
+        *min_value = minVal;
+    }
+    else if (num_of_dims == 3)
+    {
+        for (vx_uint32 y = 0; y < dims[2]; y++)
+        {
+            for (vx_uint32 x = 0; x < dims[1]; x++)
+            {
+                for (vx_uint32 z = 0; z < dims[0]; z++)
+                {
+                    vx_uint32 offset = y * src_strides[2] + x * src_strides[1] + z * src_strides[0];
+                    vx_int16 val = *(vx_int16 *)((vx_int8 *)src + offset);
+                    if (val > maxVal)
+                    {
+                        maxVal = val;
+                    }
+                    if (val < minVal)
+                    {
+                        minVal = val;
+                    }
+                }
+            }
+        }
+        *max_value = maxVal;
+        *min_value = minVal;
+    }
+}
+
+static void releaseRes(void *pData)
+{
+    if (NULL != pData)
+    {
+        ct_free_mem(pData);
+    }
+    return;
+}
+
+static vx_status calcColorWeight(vx_uint8 cn, vx_float64 gauss_color_coeff, vx_float32 **color_weight)
+{
+    vx_float32 *tmp_weight = (vx_float32 *)ct_alloc_mem(cn * COLOR_WEIGHT_SIZE_PER_CHANNEL * sizeof(vx_float32));
+    if (NULL == tmp_weight)
+    {
+        return VX_ERROR_NO_MEMORY;
+    }
+
+    for (vx_int32 i = 0; i < (cn * COLOR_WEIGHT_SIZE_PER_CHANNEL); i++)
+    {
+        tmp_weight[i] = (vx_float32)exp(i * i * gauss_color_coeff);
+    }
+
+    *color_weight = tmp_weight;
+
+    return VX_SUCCESS;
+}
+
+static vx_status calcSpaceWeight(vx_int32 diameter, vx_float64 gauss_space_coeff, vx_float32 **space_weight)
+{
+    vx_int32 radius = diameter / 2;
+    vx_float32 *tmp_weight = (vx_float32 *)ct_alloc_mem(diameter * diameter * sizeof(vx_float32));
+    if (NULL == tmp_weight)
+    {
+        return VX_ERROR_NO_MEMORY;
+    }
+
+    for (vx_int32 i = -radius; i <= radius; i++)
+    {
+        vx_int32 j = -radius;
+        for (; j <= radius; j++)
+        {
+            vx_float64 r = sqrt((vx_float64)i * i + (vx_float64)j * j);
+            if (r > radius)
+            {
+                continue;
+            }
+            tmp_weight[(i + radius) * diameter + (j + radius)] = (vx_float32)exp(r * r * gauss_space_coeff);
+        }
+    }
+
+    *space_weight = tmp_weight;
+
+    return VX_SUCCESS;
+}
+
+
 static void ownCheckBilateralFilterResult(
         const void * in_ptr, const vx_size * in_dims, const vx_size * in_strides,
         enum TestTensorDF fmt,
         vx_size dim_num,
-        vx_size out_count,
         int   diameter,
         float sigmaSpace,
-        float sigmaValues,
-        void * out_ptr, const vx_size * out_dims, const vx_size * out_strides)
+        float sigmaColor,
+        void * out_ptr, const vx_size * out_dims, const vx_size * out_strides,
+        vx_border_t border)
 {
+    vx_status status = VX_SUCCESS;
     vx_float32 tolerance = 0.0;
     vx_float32 total_num = 0.0;
     vx_float32 equal_num = 0.0;
-    vx_int32 radius = diameter/2;
-    vx_float32 color_weight_8[256];
-    vx_float32 color_weight_16[256*256];
-    vx_float32 sum = 0, wsum = 0, w = 0;
-    vx_float32 gauss_color_coeff = -0.5/(sigmaValues*sigmaValues);
-    vx_float32 gauss_space_coeff = -0.5/(sigmaSpace*sigmaSpace);
+    vx_int32 y = 0, x = 0;
+    vx_int32 low_x, low_y, high_x, high_y;
+    vx_int32 radius_y, radius_x;
+    vx_float32 scale_index = 0;
+    vx_int32 radius = diameter / 2;
+    vx_enum border_mode = border.mode;
+    vx_int16 out = 0, ref = 0;
 
-    vx_float32 *space_weight = (vx_float32*)malloc((radius * 2 + 1) * sizeof(vx_float32));
+    vx_float32 *color_weight = NULL;
+    vx_float32 *space_weight = NULL;
+    vx_uint8 cn = dim_num == 2 ? 1 : 3;
 
-    for(vx_int32 i = 0; i < 256; i++)
+    vx_float64 gauss_color_coeff = -0.5/(sigmaColor*sigmaColor);
+    vx_float64 gauss_space_coeff = -0.5/(sigmaSpace*sigmaSpace);
+
+    if (border.mode == VX_BORDER_UNDEFINED)
     {
-        color_weight_8[i] = (vx_float32)exp(i*i*gauss_color_coeff);
+        low_x = radius;
+        high_x = (in_dims[dim_num - 2] >= radius) ? in_dims[dim_num - 2] - radius : 0;
+        low_y = radius;
+        high_y = (in_dims[dim_num - 1] >= radius) ? in_dims[dim_num - 1] - radius : 0;
+    }
+    else
+    {
+        low_x = 0;
+        high_x = in_dims[dim_num - 2];
+        low_y = 0;
+        high_y = in_dims[dim_num - 1];
     }
 
-    for(vx_int32 i = 0; i < 256*256; i++)
+    if (fmt == TT_Q78)
     {
-        color_weight_16[i] = (vx_float32)exp(i*i*gauss_color_coeff);
-    }
-
-    for(vx_int32 i = -radius; i <= radius; i++ )
-    {
-        space_weight[i+radius] = (vx_float32)exp(i*i*gauss_space_coeff);
-    }
-
-    for (size_t index = radius; index < out_count-radius; ++index)
-    {
-        const size_t in_byte_offset = ownGetFlatByteOffset(index, dim_num, in_dims, in_strides);
-        const size_t out_byte_offset = ownGetFlatByteOffset(index, dim_num, out_dims, out_strides);
-
-        const char * in_b_ptr = (char*)in_ptr + in_byte_offset;
-        const char * out_b_ptr = (char*)out_ptr + out_byte_offset;
-
-        switch (fmt)
+        vx_int16 minVal = -1;
+        vx_int16 maxVal = 1;
+        getMinMax(in_ptr, in_strides, in_dims, dim_num, &maxVal, &minVal);
+        if ((vx_float32)(abs(maxVal - minVal)) < FLT_EPSILON)
         {
-            case TT_Q78:
+            if (dim_num == 2)
             {
-                const vx_int16 in = *(vx_int16*)in_b_ptr;
-                const vx_int16 out = *(vx_int16*)out_b_ptr;
-                int16_t ref;
-
-                sum = 0, wsum = 0;
-
-                for(vx_int32 j = -radius; j <= radius; j++)
+                for (y = low_y; y < high_y; y++)
                 {
-                    vx_size nei_byte_offset = ownGetFlatByteOffset(index + j, dim_num, in_dims, in_strides);
-                    const char *nei_b_ptr = (char*)in_ptr + nei_byte_offset;
-                    const vx_int16 nei = *(vx_int16*)nei_b_ptr;
-                    w = space_weight[j+radius]*color_weight_16[abs(nei - in)];
-                    sum += nei*w;
-                    wsum += w;
+                    for (x = low_x; x < high_x; x++)
+                    {
+                        out = *((vx_int16 *)((vx_uint8 *)out_ptr + y * in_strides[1] + x * in_strides[0]));
+                        ref = *((vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[1] + x * in_strides[0]));
+                        if (out == ref)
+                        {
+                            equal_num += 1;
+                        }
+                        total_num += 1;
+                    }
                 }
-                ref = (vx_int16)round(sum/wsum);
-                
-                total_num += 1; 
+                tolerance = (equal_num / total_num);
+                ASSERT(tolerance >= MIN_TOLERANCE);
+                return;
+            }
+            else if (dim_num == 3)
+            {
+                for (y = low_y; y < high_y; y++)
+                {
+                    for (x = low_x; x < high_x; x++)
+                    {
+                        out = *(vx_int16 *)((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 0 * out_strides[0]);
+                        ref = *(vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 0 * in_strides[0]);
+                        if (out == ref)
+                        {
+                            equal_num += 1;
+                        }
+                        out = *(vx_int16 *)((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 1 * out_strides[0]);
+                        ref = *(vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 1 * in_strides[0]);
+                        if (out == ref)
+                        {
+                            equal_num += 1;
+                        }
+                        out = *(vx_int16 *)((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 2 * out_strides[0]);
+                        ref = *(vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 2 * in_strides[0]);
+                        if (out == ref)
+                        {
+                            equal_num += 1;
+                        }
+                        total_num += 3;
+                    }
+                }
+                tolerance = (equal_num / total_num);
+                ASSERT(tolerance >= MIN_TOLERANCE);
+                return;
+            }
+
+            ASSERT(tolerance >= MIN_TOLERANCE);
+            return;
+        }
+
+        //calculation color weight
+        vx_int32 kExpNumBinsPerChannel = 1 << 12;
+        vx_float32 lastExpVal = 1.f;
+        vx_float32 len;
+        vx_int32 kExpNumBins;
+        len = (vx_float32)(maxVal - minVal) * cn;
+        kExpNumBins = kExpNumBinsPerChannel * cn;
+        color_weight = (vx_float32 *)ct_alloc_mem((kExpNumBins + 2) * sizeof(vx_float32));
+        if (NULL == color_weight)
+        {
+            ASSERT(tolerance >= MIN_TOLERANCE);
+            return;
+        }
+        scale_index = kExpNumBins / len;
+        for (vx_uint32 i = 0; i < (kExpNumBins + 2); i++)
+        {
+            if (lastExpVal > 0.f)
+            {
+                vx_float64 val = i / scale_index;
+                color_weight[i] = (vx_float32)exp(val * val * gauss_color_coeff);
+                lastExpVal = color_weight[i];
+            }
+            else
+            {
+                color_weight[i] = 0.f;
+            }
+        }
+    }
+    else if (fmt == TT_U8)
+    {
+        (void)calcColorWeight(cn, gauss_color_coeff, &color_weight);
+    }
+    status = calcSpaceWeight(diameter, gauss_space_coeff, &space_weight);
+    if (status != VX_SUCCESS)
+    {
+        releaseRes(color_weight);
+        releaseRes(space_weight);
+    }
+
+    if (dim_num == 2)
+    {
+        for (y = low_y; y < high_y; y++)
+        {
+            for (x = low_x; x < high_x; x++)
+            {
+                vx_int16 value = 0;
+                if (fmt == TT_U8)
+                {
+                    out = *((vx_uint8 *)out_ptr + y * out_strides[1] + x * out_strides[0]);
+                    value = *((vx_uint8 *)in_ptr + y * in_strides[1] + x * in_strides[0]);
+                }
+                else if (fmt == TT_Q78)
+                {
+                    out = *((vx_int16 *)((vx_uint8 *)out_ptr + y * out_strides[1] + x * out_strides[0]));
+                    value = *((vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[1] + x * in_strides[0]));
+                }
+
+                vx_float32 sum = 0, wsum = 0;
+                //kernel filter
+                for (radius_y = -radius; radius_y <= radius; radius_y++)
+                {
+                    for (radius_x = -radius; radius_x <= radius; radius_x++)
+                    {
+                        vx_float64 r = sqrt((vx_float64)radius_y * radius_y + (vx_float64)radius_x * radius_x);
+                        if (r > radius)
+                        {
+                            continue;
+                        }
+                        vx_int32 neighbor_x = x + radius_x;
+                        vx_int32 neighbor_y = y + radius_y;
+                        vx_int16 neighborVal = 0;
+                        if (border_mode == VX_BORDER_REPLICATE)
+                        {
+                            vx_int32 tmpx = neighbor_x < 0 ? 0 : (neighbor_x >((vx_int32)in_dims[0] - 1) ? ((vx_int32)in_dims[0] - 1) : neighbor_x);
+                            vx_int32 tmpy = neighbor_y < 0 ? 0 : (neighbor_y >((vx_int32)in_dims[1] - 1) ? ((vx_int32)in_dims[1] - 1) : neighbor_y);
+                            if (fmt == TT_U8)
+                            {
+                                neighborVal = *((vx_uint8 *)in_ptr + tmpy * in_strides[1] + tmpx * in_strides[0]);
+                            }
+                            else if (fmt == TT_Q78)
+                            {
+                                neighborVal = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[1] + tmpx * in_strides[0]));
+                            }
+                        }
+                        else if (border_mode == VX_BORDER_CONSTANT)
+                        {
+                            vx_int32 tmpx = neighbor_x < 0 ? 0 : (neighbor_x >((vx_int32)in_dims[0] - 1) ? ((vx_int32)in_dims[0] - 1) : neighbor_x);
+                            vx_int32 tmpy = neighbor_y < 0 ? 0 : (neighbor_y >((vx_int32)in_dims[1] - 1) ? ((vx_int32)in_dims[1] - 1) : neighbor_y);
+                            if (neighbor_x < 0 || neighbor_y < 0)
+                            {
+                                if (fmt == TT_U8)
+                                {
+                                    neighborVal = border.constant_value.U8;
+                                }
+                                else if (fmt == TT_Q78)
+                                {
+                                    neighborVal = border.constant_value.S16;
+                                }
+                            }
+                            else
+                            {
+                                if (fmt == TT_U8)
+                                {
+                                    neighborVal = *((vx_uint8 *)in_ptr + tmpy * in_strides[1] + tmpx * in_strides[0]);
+                                }
+                                else if (fmt == TT_Q78)
+                                {
+                                    neighborVal = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[1] + tmpx * in_strides[0]));
+                                }
+                            }
+                        }
+
+                        vx_float32 w = 0;
+                        if (fmt == TT_U8)
+                        {
+                            w = space_weight[(radius_y + radius) * diameter + (radius_x + radius)] *
+                                       color_weight[abs(neighborVal - value)];
+                        }
+                        else if (fmt == TT_Q78)
+                        {
+                            vx_float32 alpha = abs(neighborVal - value) * scale_index;
+                            vx_int32 idx = (vx_int32)floorf(alpha);
+                            alpha -= idx;
+                            w = space_weight[(radius_y + radius) * diameter + (radius_x + radius)] *
+                                (color_weight[idx] + alpha * (color_weight[idx + 1] - color_weight[idx]));
+                        }
+                        sum += neighborVal * w;
+                        wsum += w;
+                    }
+                }
+
+                if (fmt == TT_U8)
+                {
+                    ref = (vx_uint8)roundf(sum / wsum);
+                }
+                else if (fmt == TT_Q78)
+                {
+                    ref = (vx_int16)roundf(sum / wsum);
+                }
+
+                total_num += 1;
 
                 if (ref == out)
                 {
-                     equal_num += 1;
-                } 
-            }
-            break;
-            case TT_U8:
-            {
-                const vx_uint8 in = *(vx_uint8*)in_b_ptr;
-                const vx_uint8 out = *(vx_uint8*)out_b_ptr;
-                uint8_t ref;
-
-                sum = 0, wsum = 0;
-
-                for(vx_int32 j = -radius; j <= radius; j++)
-                {
-                    vx_size nei_byte_offset = ownGetFlatByteOffset(index + j, dim_num, in_dims, in_strides);
-                    const char *nei_b_ptr = (char*)in_ptr + nei_byte_offset;
-                    const vx_uint8 nei = *(vx_uint8*)nei_b_ptr;
-                    w = space_weight[j+radius]*color_weight_8[abs(nei - in)];
-                    sum += nei*w;
-                    wsum += w;
+                    equal_num += 1;
                 }
-                ref = (vx_uint8)round(sum/wsum);
-
-                total_num += 1; 
-
-                if (ref == out)
-                {
-                     equal_num += 1;
-                } 
             }
-            break;
-            default: assert(0);
+        }
+    }
+    else if (dim_num == 3)
+    {
+        for (y = low_y; y < high_y; y++)
+        {
+            for (x = low_x; x < high_x; x++)
+            {
+                vx_int16 b0 = 0, g0 = 0, r0 = 0;
+                vx_int16 outb = 0, outg = 0, outr = 0;
+                if (fmt == TT_U8)
+                {
+                    outb = *((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 0 * out_strides[0]);
+                    outg = *((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 1 * out_strides[0]);
+                    outr = *((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 2 * out_strides[0]);
+                    b0 = *((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 0 * in_strides[0]);
+                    g0 = *((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 1 * in_strides[0]);
+                    r0 = *((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 2 * in_strides[0]);
+                }
+                else if (fmt == TT_Q78)
+                {
+                    outb = *((vx_int16 *)((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 0 * out_strides[0]));
+                    outg = *((vx_int16 *)((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 1 * out_strides[0]));
+                    outr = *((vx_int16 *)((vx_uint8 *)out_ptr + y * out_strides[2] + x * out_strides[1] + 2 * out_strides[0]));
+                    b0 = *((vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 0 * in_strides[0]));
+                    g0 = *((vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 1 * in_strides[0]));
+                    r0 = *((vx_int16 *)((vx_uint8 *)in_ptr + y * in_strides[2] + x * in_strides[1] + 2 * in_strides[0]));
+                }
+                vx_float32 sum_b = 0, sum_g = 0, sum_r = 0, wsum = 0;
+                //kernel filter
+                for (radius_y = -radius; radius_y <= radius; radius_y++)
+                {
+                    for (radius_x = -radius; radius_x <= radius; radius_x++)
+                    {
+                        vx_float64 dist = sqrt((vx_float64)radius_y * radius_y + (vx_float64)radius_x * radius_x);
+                        if (dist > radius)
+                        {
+                            continue;
+                        }
+                        vx_int32 neighbor_x = x + radius_x;
+                        vx_int32 neighbor_y = y + radius_y;
+                        vx_int16 b = 0, g = 0, r = 0;
+                        if (border_mode == VX_BORDER_REPLICATE)
+                        {
+                            vx_int32 tmpx = neighbor_x < 0 ? 0 : (neighbor_x >((vx_int32)in_dims[1] - 1) ? ((vx_int32)in_dims[1] - 1) : neighbor_x);
+                            vx_int32 tmpy = neighbor_y < 0 ? 0 : (neighbor_y >((vx_int32)in_dims[2] - 1) ? ((vx_int32)in_dims[2] - 1) : neighbor_y);
+                            if (fmt == TT_U8)
+                            {
+                                b = *((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 0 * in_strides[0]);
+                                g = *((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 1 * in_strides[0]);
+                                r = *((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 2 * in_strides[0]);
+                            }
+                            else if (fmt == TT_Q78)
+                            {
+                                b = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 0 * in_strides[0]));
+                                g = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 1 * in_strides[0]));
+                                r = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 2 * in_strides[0]));
+                            }
+                        }
+                        else if (border_mode == VX_BORDER_CONSTANT)
+                        {
+                            vx_int32 tmpx = neighbor_x < 0 ? 0 : (neighbor_x >((vx_int32)in_dims[1] - 1) ? ((vx_int32)in_dims[1] - 1) : neighbor_x);
+                            vx_int32 tmpy = neighbor_y < 0 ? 0 : (neighbor_y >((vx_int32)in_dims[2] - 1) ? ((vx_int32)in_dims[2] - 1) : neighbor_y);
+                            if (neighbor_x < 0 || neighbor_y < 0)
+                            {
+                                if (fmt == TT_U8)
+                                {
+                                    b = g = r = border.constant_value.U8;
+                                }
+                                else if (fmt == TT_Q78)
+                                {
+                                    b = g = r  = border.constant_value.S16;
+                                }
+                            }
+                            else
+                            {
+                                if (fmt == TT_U8)
+                                {
+                                    b = *((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 0 * in_strides[0]);
+                                    g = *((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 1 * in_strides[0]);
+                                    r = *((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 2 * in_strides[0]);
+                                }
+                                else if (fmt == TT_Q78)
+                                {
+                                    b = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 0 * in_strides[0]));
+                                    g = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 1 * in_strides[0]));
+                                    r = *((vx_int16 *)((vx_uint8 *)in_ptr + tmpy * in_strides[2] + tmpx * in_strides[1] + 2 * in_strides[0]));
+                                }
+                            }
+                        }
+
+                        vx_float32 w = 0;
+                        if (fmt == TT_U8)
+                        {
+                            w = space_weight[(radius_y + radius) * diameter + (radius_x + radius)] *
+                                       color_weight[abs(b - b0) + abs(g - g0) + abs(r - r0)];
+                        }
+                        else if (fmt == TT_Q78)
+                        {
+                            vx_float32 alpha = (abs(b- b0) + abs(g - g0) + abs(r - r0)) * scale_index;
+                            vx_int32 idx = (vx_int32)floorf(alpha);
+                            alpha -= idx;
+                            w = space_weight[(radius_y + radius) * diameter + (radius_x + radius)] *
+                                (color_weight[idx] + alpha * (color_weight[idx + 1] - color_weight[idx]));
+                        }
+                        sum_b += b * w;
+                        sum_g += g * w;
+                        sum_r += r * w;
+                        wsum += w;
+                    }
+                }
+
+                vx_int16 refb = 0, refg = 0, refr = 0;
+                if (fmt == TT_U8)
+                {
+                    refb = (vx_uint8)roundf(sum_b / wsum);
+                    refg = (vx_uint8)roundf(sum_g / wsum);
+                    refr = (vx_uint8)roundf(sum_r / wsum);
+                }
+                else if (fmt == TT_Q78)
+                {
+                    refb = (vx_int16)roundf(sum_b / wsum);
+                    refg = (vx_int16)roundf(sum_g / wsum);
+                    refr = (vx_int16)roundf(sum_r / wsum);
+                }
+
+                total_num += 3;
+
+                if (refb == outb)
+                {
+                    equal_num += 1;
+                }
+                if (refg == outg)
+                {
+                    equal_num += 1;
+                }
+                if (refr == outr)
+                {
+                    equal_num += 1;
+                }
+            }
         }
     }
 
     tolerance = (equal_num / total_num);
 
-    free(space_weight);
-
     ASSERT(tolerance >= MIN_TOLERANCE);
+
+    releaseRes(color_weight);
+    releaseRes(space_weight);
 }
 
 /****************************************************************************
@@ -232,151 +622,294 @@
 
 TESTCASE(BilateralFilter, CT_VXContext, ct_setup_vx_context, 0)
 
-typedef struct
+static void* bilateral_generate_random(int width, int height, int cn, enum TestTensorDF tensor_fmt)
 {
-    const char * name;
-    enum TestTensorDF src_fmt;
-    enum TestTensorDF dst_fmt;
-    int   diameter;
-    float sigmaSpace;
-    float sigmaValues;
-} test_bilateral_filter_op_arg;
-
-TEST_WITH_ARG(BilateralFilter, testBilateralFilterOp, test_bilateral_filter_op_arg,
-        ARG("BILATERAL_FILTER_Q78", TT_Q78, TT_Q78, 5, 1, 1),
-        ARG("BILATERAL_FILTER_U8", TT_U8, TT_U8, 5, 1, 1),
-)
-{
-    const vx_context context = context_->vx_context_;
-    const enum TestTensorDF src_fmt = arg_->src_fmt;
-    const enum TestTensorDF dst_fmt = arg_->dst_fmt;
-    assert(src_fmt == TT_Q78 || src_fmt == TT_U8);
-    assert(dst_fmt == TT_Q78 || dst_fmt == TT_U8);
-
-    const int diameter = arg_->diameter;
-    const float sigmaSpace = arg_->sigmaSpace;
-    const float sigmaValues = arg_->sigmaValues;
-
-    vx_size max_dims = 0;
-    {
-        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
-        ASSERT(max_dims > 3);
-        if(!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
-    }
-
+    vx_enum data_type = VX_TYPE_UINT8;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = sizeof(vx_uint8);
+    size_t count = 0;
     uint64_t rng;
     {
         uint64_t * seed = &CT()->seed_;
-        ASSERT(!!seed);
+        //ASSERT(!!seed);
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum src_data_type;
-    vx_enum dst_data_type;
-    vx_uint8 src_fixed_point_position;
-    vx_uint8 dst_fixed_point_position;
-    vx_size src_sizeof_data_type;
-    vx_size dst_sizeof_data_type;
+    ownUnpackFormat(tensor_fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    count = width * height * cn;
+    void *data = ct_alloc_mem(count * sizeof_data_type);
+    if (data != NULL)
+    {
+        ownFillRandData(tensor_fmt, &rng, count, data);
+    }
+
+    return data;
+}
+
+typedef struct {
+    const char* testName;
+    void* (*generator)(int width, int height, int cn, enum TestTensorDF tensor_fmt);
+    const char* fileName;
+    vx_border_t border;
+    int width, height;
+    int cn;
+    int diameter;
+    float sigmaSpace;
+    float sigmaColor;
+    enum TestTensorDF tensor_fmt;
+} bilateral_arg;
+
+#define BILATERAL_FILTER_BORDERS(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_REPLICATE", __VA_ARGS__, { VX_BORDER_REPLICATE, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=0", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=1", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 1 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=127", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 127 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=255", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 255 }} }))
+
+#define BILATERAL_CHANNEL(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/channel=1", __VA_ARGS__, 1)), \
+    CT_EXPAND(nextmacro(testArgName "/channel=3", __VA_ARGS__, 3))
+
+#define BILATERAL_DIAMETER(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/diameter=5", __VA_ARGS__, 5)), \
+    CT_EXPAND(nextmacro(testArgName "/diameter=7", __VA_ARGS__, 7)), \
+    CT_EXPAND(nextmacro(testArgName "/diameter=9", __VA_ARGS__, 9)) \
+
+#define BILATERAL_SPACE_WEIGHT(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/sigmaSpace=10", __VA_ARGS__, 10))
+
+#define BILATERAL_COLOR_WEIGHT(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/sigmaColor=5", __VA_ARGS__, 5))
+
+#define BILATERAL_FORMAT(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/TT_U8", __VA_ARGS__, TT_U8)), \
+    CT_EXPAND(nextmacro(testArgName "/TT_Q78", __VA_ARGS__, TT_Q78))
+
+#define BILATERAL_PARAMETERS \
+    CT_GENERATE_PARAMETERS("randam", BILATERAL_FILTER_BORDERS, ADD_SIZE_SMALL_SET, BILATERAL_CHANNEL, BILATERAL_DIAMETER, BILATERAL_SPACE_WEIGHT, BILATERAL_COLOR_WEIGHT, BILATERAL_FORMAT, ARG, bilateral_generate_random, NULL)
+
+TEST_WITH_ARG(BilateralFilter, testGraphProcessing, bilateral_arg,
+        BILATERAL_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    const enum TestTensorDF src_fmt = arg_->tensor_fmt;
+    const enum TestTensorDF dst_fmt = arg_->tensor_fmt;
+    assert(src_fmt == TT_Q78 || src_fmt == TT_U8);
+    assert(dst_fmt == TT_Q78 || dst_fmt == TT_U8);
+    const vx_border_t border = arg_->border;
+    const int diameter = arg_->diameter;
+    const float sigmaSpace = arg_->sigmaSpace;
+    const float sigmaColor = arg_->sigmaColor;
+    const int cn = arg_->cn;
+    const int width = arg_->width;
+    const int height = arg_->height;
+    vx_size num_of_dims = 2;
+
+    vx_enum src_data_type = 0;
+    vx_enum dst_data_type = 0;
+    vx_uint8 src_fixed_point_position = 0;
+    vx_uint8 dst_fixed_point_position= 0;
+    vx_size src_sizeof_data_type = 1;
+    vx_size dst_sizeof_data_type = 1;
     ownUnpackFormat(src_fmt, &src_data_type, &src_fixed_point_position, &src_sizeof_data_type);
     ownUnpackFormat(dst_fmt, &dst_data_type, &dst_fixed_point_position, &dst_sizeof_data_type);
 
-    size_t * const tensor_dims = malloc(sizeof(*tensor_dims) * max_dims);
-    size_t * const src_tensor_strides = malloc(sizeof(*src_tensor_strides) * max_dims);
-    size_t * const dst_tensor_strides = malloc(sizeof(*dst_tensor_strides) * max_dims);
-    ASSERT(tensor_dims && src_tensor_strides && dst_tensor_strides);
-
-    // The input data a vx_tensor. maximum 3 dimension and minimum 2.
-    for (vx_size dims = 2; dims <= max_dims; ++dims)
-    for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
+    if (cn == 3)
     {
-        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
-        {
-            printf("dims #: %zu,\titer #: %d\n", dims, iter);
-            fflush(stdout);
-        }
-
-        for (vx_size i = 0; i < dims; ++i)
-        {
-            tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
-
-            src_tensor_strides[i] = i ? src_tensor_strides[i-1] * tensor_dims[i-1] : src_sizeof_data_type;
-            dst_tensor_strides[i] = i ? dst_tensor_strides[i-1] * tensor_dims[i-1] : dst_sizeof_data_type;
-        }
-
-        vx_tensor src_tensor = vxCreateTensor(context, dims, tensor_dims, src_data_type, src_fixed_point_position);
-        vx_tensor dst_tensor = vxCreateTensor(context, dims, tensor_dims, dst_data_type, dst_fixed_point_position);
-        ASSERT_VX_OBJECT(src_tensor, VX_TYPE_TENSOR);
-        ASSERT_VX_OBJECT(dst_tensor, VX_TYPE_TENSOR);
-
-        const size_t src_tensor_bytes = tensor_dims[dims-1] * src_tensor_strides[dims-1];
-        const size_t dst_tensor_bytes = tensor_dims[dims-1] * dst_tensor_strides[dims-1];
-        const size_t count = src_tensor_bytes / src_sizeof_data_type;
-
-        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
-        {
-            printf("\tconfig: {\n");
-            printf("\t          tensor_dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", tensor_dims[i]); } printf(" }, \n");
-            printf("\t        }\n");
-        }
-
-        void * const src_data = malloc(src_tensor_bytes);
-        void * const dst_data = malloc(dst_tensor_bytes);
-        ASSERT(src_data && dst_data);
-
-        {
-            ownFillRandData(src_fmt, &rng, count, src_data);
-
-            vx_size view_start[MAX_TENSOR_DIMS] = { 0 };
-            VX_CALL(vxCopyTensorPatch(src_tensor, dims, view_start, tensor_dims, src_tensor_strides, src_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
-        }
-
-        {
-            vx_graph graph = vxCreateGraph(context);
-            ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
-
-            vx_node node = vxBilateralFilterNode(graph, src_tensor, diameter,  sigmaSpace, sigmaValues, dst_tensor);
-
-            ASSERT_VX_OBJECT(node, VX_TYPE_NODE);
-            VX_CALL(vxReleaseNode(&node));
-            EXPECT_EQ_PTR(NULL, node);
-
-            VX_CALL(vxVerifyGraph(graph));
-            VX_CALL(vxProcessGraph(graph));
-
-            VX_CALL(vxReleaseGraph(&graph));
-            EXPECT_EQ_PTR(NULL, graph);
-        }
-
-        // Verify the reuslts
-        {
-            const size_t view_start[MAX_TENSOR_DIMS] = { 0 };
-            VX_CALL(vxCopyTensorPatch(dst_tensor, dims, view_start, tensor_dims, dst_tensor_strides, dst_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
-
-            ownCheckBilateralFilterResult(
-                    src_data, tensor_dims, src_tensor_strides,
-                    dst_fmt,
-                    dims,
-                    count,
-                    diameter,
-                    sigmaSpace,
-                    sigmaValues,
-                    dst_data, tensor_dims, dst_tensor_strides);
-        }
-
-        VX_CALL(vxReleaseTensor(&src_tensor));
-        VX_CALL(vxReleaseTensor(&dst_tensor));
-        EXPECT_EQ_PTR(NULL, src_tensor);
-        EXPECT_EQ_PTR(NULL, dst_tensor);
-
-        free(src_data);
-        free(dst_data);
+        num_of_dims = 3;
     }
 
-    free(tensor_dims);
-    free(src_tensor_strides);
-    free(dst_tensor_strides);
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * num_of_dims);
+    size_t * const src_tensor_strides = ct_alloc_mem(sizeof(*src_tensor_strides) * num_of_dims);
+    size_t * const dst_tensor_strides = ct_alloc_mem(sizeof(*dst_tensor_strides) * num_of_dims);
+    ASSERT(tensor_dims && src_tensor_strides && dst_tensor_strides);
+
+    if (num_of_dims == 3)
+    {
+        tensor_dims[0] = 3;
+        tensor_dims[1] = width;
+        tensor_dims[2] = height;
+
+        src_tensor_strides[0] = src_sizeof_data_type;
+        src_tensor_strides[1] = tensor_dims[0] * src_tensor_strides[0];
+        src_tensor_strides[2] = tensor_dims[1] * src_tensor_strides[1];
+
+        dst_tensor_strides[0] = src_tensor_strides[0];
+        dst_tensor_strides[1] = src_tensor_strides[1];
+        dst_tensor_strides[2] = src_tensor_strides[2];
+    }
+    else
+    {
+        tensor_dims[0] = width;
+        tensor_dims[1] = height;
+
+        src_tensor_strides[0] = src_sizeof_data_type;
+        src_tensor_strides[1] = tensor_dims[0] * src_tensor_strides[0];
+
+        dst_tensor_strides[0] = src_tensor_strides[0];
+        dst_tensor_strides[1] = src_tensor_strides[1];
+    }
+
+    const size_t dst_tensor_bytes = tensor_dims[num_of_dims-1] * dst_tensor_strides[num_of_dims-1];
+
+    vx_tensor src_tensor = vxCreateTensor(context, num_of_dims, tensor_dims, src_data_type, src_fixed_point_position);
+    vx_tensor dst_tensor = vxCreateTensor(context, num_of_dims, tensor_dims, dst_data_type, dst_fixed_point_position);
+
+    void * const dst_data = ct_alloc_mem(dst_tensor_bytes);
+    vx_size *view_start = (vx_size *)ct_alloc_mem(num_of_dims * sizeof(vx_size));
+    memset(view_start, 0, num_of_dims * sizeof(vx_size));
+
+    void *src_data = NULL;
+    src_data = arg_->generator(arg_->width, arg_->height, arg_->cn, arg_->tensor_fmt);
+    VX_CALL(vxCopyTensorPatch(src_tensor, num_of_dims, view_start, tensor_dims, src_tensor_strides, src_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+    vx_graph graph = vxCreateGraph(context);
+    ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
+
+    vx_node node = vxBilateralFilterNode(graph, src_tensor, diameter,  sigmaSpace, sigmaColor, dst_tensor);
+
+    ASSERT_VX_OBJECT(node, VX_TYPE_NODE);
+    VX_CALL(vxSetNodeAttribute(node, VX_NODE_BORDER, &border, sizeof(border)));
+    VX_CALL(vxReleaseNode(&node));
+    EXPECT_EQ_PTR(NULL, node);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(NULL, graph);
+
+    VX_CALL(vxCopyTensorPatch(dst_tensor, num_of_dims, view_start, tensor_dims, dst_tensor_strides, dst_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+    ownCheckBilateralFilterResult(
+                    src_data, tensor_dims, src_tensor_strides,
+                    dst_fmt,
+                    num_of_dims,
+                    diameter,
+                    sigmaSpace,
+                    sigmaColor,
+                    dst_data, tensor_dims, dst_tensor_strides,
+                    border);
+
+    VX_CALL(vxReleaseTensor(&src_tensor));
+    VX_CALL(vxReleaseTensor(&dst_tensor));
+    EXPECT_EQ_PTR(NULL, src_tensor);
+    EXPECT_EQ_PTR(NULL, dst_tensor);
+
+    ct_free_mem(src_data);
+    ct_free_mem(dst_data);
+    ct_free_mem(view_start);
+    ct_free_mem(tensor_dims);
+    ct_free_mem(src_tensor_strides);
+    ct_free_mem(dst_tensor_strides);
 }
 
+TEST_WITH_ARG(BilateralFilter, testImmediateProcessing, bilateral_arg,
+        BILATERAL_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    const enum TestTensorDF src_fmt = arg_->tensor_fmt;
+    const enum TestTensorDF dst_fmt = arg_->tensor_fmt;
+    assert(src_fmt == TT_Q78 || src_fmt == TT_U8);
+    assert(dst_fmt == TT_Q78 || dst_fmt == TT_U8);
+    const vx_border_t border = arg_->border;
+    const int diameter = arg_->diameter;
+    const float sigmaSpace = arg_->sigmaSpace;
+    const float sigmaColor = arg_->sigmaColor;
+    const int cn = arg_->cn;
+    const int width = arg_->width;
+    const int height = arg_->height;
+    vx_size num_of_dims = 2;
+
+    vx_enum src_data_type = 0;
+    vx_enum dst_data_type = 0;
+    vx_uint8 src_fixed_point_position = 0;
+    vx_uint8 dst_fixed_point_position = 0;
+    vx_size src_sizeof_data_type = 1;
+    vx_size dst_sizeof_data_type = 1;
+    ownUnpackFormat(src_fmt, &src_data_type, &src_fixed_point_position, &src_sizeof_data_type);
+    ownUnpackFormat(dst_fmt, &dst_data_type, &dst_fixed_point_position, &dst_sizeof_data_type);
+
+    if (cn == 3)
+    {
+        num_of_dims = 3;
+    }
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * num_of_dims);
+    size_t * const src_tensor_strides = ct_alloc_mem(sizeof(*src_tensor_strides) * num_of_dims);
+    size_t * const dst_tensor_strides = ct_alloc_mem(sizeof(*dst_tensor_strides) * num_of_dims);
+    ASSERT(tensor_dims && src_tensor_strides && dst_tensor_strides);
+
+    if (num_of_dims == 3)
+    {
+        tensor_dims[0] = 3;
+        tensor_dims[1] = width;
+        tensor_dims[2] = height;
+
+        src_tensor_strides[0] = src_sizeof_data_type;
+        src_tensor_strides[1] = tensor_dims[0] * src_tensor_strides[0];
+        src_tensor_strides[2] = tensor_dims[1] * src_tensor_strides[1];
+
+        dst_tensor_strides[0] = src_tensor_strides[0];
+        dst_tensor_strides[1] = src_tensor_strides[1];
+        dst_tensor_strides[2] = src_tensor_strides[2];
+    }
+    else
+    {
+        tensor_dims[0] = width;
+        tensor_dims[1] = height;
+
+        src_tensor_strides[0] = src_sizeof_data_type;
+        src_tensor_strides[1] = tensor_dims[0] * src_tensor_strides[0];
+
+        dst_tensor_strides[0] = src_tensor_strides[0];
+        dst_tensor_strides[1] = src_tensor_strides[1];
+    }
+
+    const size_t dst_tensor_bytes = tensor_dims[num_of_dims-1] * dst_tensor_strides[num_of_dims-1];
+
+    vx_tensor src_tensor = vxCreateTensor(context, num_of_dims, tensor_dims, src_data_type, src_fixed_point_position);
+    vx_tensor dst_tensor = vxCreateTensor(context, num_of_dims, tensor_dims, dst_data_type, dst_fixed_point_position);
+
+    void * const dst_data = ct_alloc_mem(dst_tensor_bytes);
+    vx_size *view_start = (vx_size *)ct_alloc_mem(num_of_dims * sizeof(vx_size));
+    memset(view_start, 0, num_of_dims * sizeof(vx_size));
+
+    void *src_data = NULL;
+    src_data = arg_->generator(arg_->width, arg_->height, arg_->cn, arg_->tensor_fmt);
+    VX_CALL(vxCopyTensorPatch(src_tensor, num_of_dims, view_start, tensor_dims, src_tensor_strides, src_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+    VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
+    VX_CALL(vxuBilateralFilter(context, src_tensor, diameter, sigmaSpace, sigmaColor, dst_tensor));
+
+    VX_CALL(vxCopyTensorPatch(dst_tensor, num_of_dims, view_start, tensor_dims, dst_tensor_strides, dst_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+    ownCheckBilateralFilterResult(
+                    src_data, tensor_dims, src_tensor_strides,
+                    dst_fmt,
+                    num_of_dims,
+                    diameter,
+                    sigmaSpace,
+                    sigmaColor,
+                    dst_data, tensor_dims, dst_tensor_strides,
+                    border);
+
+    VX_CALL(vxReleaseTensor(&src_tensor));
+    VX_CALL(vxReleaseTensor(&dst_tensor));
+    EXPECT_EQ_PTR(NULL, src_tensor);
+    EXPECT_EQ_PTR(NULL, dst_tensor);
+
+    ct_free_mem(src_data);
+    ct_free_mem(dst_data);
+    ct_free_mem(view_start);
+    ct_free_mem(tensor_dims);
+    ct_free_mem(src_tensor_strides);
+    ct_free_mem(dst_tensor_strides);
+}
+
+
 
 TEST(BilateralFilter, testNodeCreation)
 {
@@ -412,9 +945,9 @@
     ownUnpackFormat(src_fmt, &src_data_type, &src_fixed_point_position, &src_sizeof_data_type);
     ownUnpackFormat(dst_fmt, &dst_data_type, &dst_fixed_point_position, &dst_sizeof_data_type);
 
-    size_t * const tensor_dims = malloc(sizeof(*tensor_dims) * max_dims);
-    size_t * const src_tensor_strides = malloc(sizeof(*src_tensor_strides) * max_dims);
-    size_t * const dst_tensor_strides = malloc(sizeof(*dst_tensor_strides) * max_dims);
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    size_t * const src_tensor_strides = ct_alloc_mem(sizeof(*src_tensor_strides) * max_dims);
+    size_t * const dst_tensor_strides = ct_alloc_mem(sizeof(*dst_tensor_strides) * max_dims);
     ASSERT(tensor_dims && src_tensor_strides && dst_tensor_strides);
 
     // The input data a vx_tensor. maximum 3 dimension and minimum 2.
@@ -451,8 +984,8 @@
             printf("\t        }\n");
         }
 
-        void * const src_data = malloc(src_tensor_bytes);
-        void * const dst_data = malloc(dst_tensor_bytes);
+        void * const src_data = ct_alloc_mem(src_tensor_bytes);
+        void * const dst_data = ct_alloc_mem(dst_tensor_bytes);
         ASSERT(src_data && dst_data);
 
         {
@@ -483,16 +1016,19 @@
         EXPECT_EQ_PTR(NULL, src_tensor);
         EXPECT_EQ_PTR(NULL, dst_tensor);
 
-        free(src_data);
-        free(dst_data);
+        ct_free_mem(src_data);
+        ct_free_mem(dst_data);
     }
 
-    free(tensor_dims);
-    free(src_tensor_strides);
-    free(dst_tensor_strides);
+    ct_free_mem(tensor_dims);
+    ct_free_mem(src_tensor_strides);
+    ct_free_mem(dst_tensor_strides);
 }
 
 TESTCASE_TESTS(BilateralFilter,
     testNodeCreation,
-    testBilateralFilterOp
+    testGraphProcessing,
+    testImmediateProcessing
 );
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_binop16s.c b/test_conformance/test_binop16s.c
index d3ab072..61e3979 100644
--- a/test_conformance/test_binop16s.c
+++ b/test_conformance/test_binop16s.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
 
 #include "test_engine/test.h"
 
@@ -28,8 +29,8 @@
     uint32_t i, j;
 
     ASSERT(src0 && src1 && dst);
-    ASSERT(src0->width = src1->width && src0->width == dst->width);
-    ASSERT(src0->height = src1->height && src0->height == dst->height);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
     ASSERT(src0->format == src1->format && src1->format == VX_DF_IMAGE_S16);
     ASSERT(dst->format == VX_DF_IMAGE_S16 || dst->format == VX_DF_IMAGE_U16);
 
@@ -298,3 +299,5 @@
 
 TESTCASE_TESTS(vxuBinOp16s, DISABLED_testNegativeSizes,                testFuzzy)
 TESTCASE_TESTS(vxBinOp16s,  DISABLED_testNegativeSizes, testInference, testFuzzy)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_binop1u.c b/test_conformance/test_binop1u.c
new file mode 100644
index 0000000..9e47386
--- /dev/null
+++ b/test_conformance/test_binop1u.c
@@ -0,0 +1,343 @@
+/*
+
+ * Copyright (c) 2012-2017 The Khronos Group Inc.
+ *
+ * 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.
+ */
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+#ifdef OPENVX_USE_U1
+
+#include "test_engine/test.h"
+
+#include <VX/vx.h>
+#include <VX/vxu.h>
+
+//#define CT_EXECUTE_ASYNC
+
+static void referenceAnd(CT_Image src0, CT_Image src1, CT_Image dst)
+{
+    uint32_t i, j;
+
+    ASSERT(src0 && src1 && dst);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
+    ASSERT(src0->format == dst->format && src1->format == dst->format && dst->format == VX_DF_IMAGE_U1);
+
+    for (i = 0; i < dst->height; ++i)
+        for (j = 0; j < dst->width; ++j)
+        {
+            uint32_t xShftd = j + src0->roi.x % 8;
+            uint8_t  mask   = 1 << (xShftd % 8);
+            uint8_t  byte_val = src0->data.y[i * ct_stride_bytes(src0) + xShftd / 8] &
+                                src1->data.y[i * ct_stride_bytes(src1) + xShftd / 8];
+            dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~mask) | (byte_val & mask);
+        }
+}
+
+static void referenceOr(CT_Image src0, CT_Image src1, CT_Image dst)
+{
+    uint32_t i, j;
+
+    ASSERT(src0 && src1 && dst);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
+    ASSERT(src0->format == dst->format && src1->format == dst->format && dst->format == VX_DF_IMAGE_U1);
+
+    for (i = 0; i < dst->height; ++i)
+        for (j = 0; j < dst->width; ++j)
+        {
+            uint32_t xShftd = j + src0->roi.x % 8;
+            uint8_t  mask   = 1 << (xShftd % 8);
+            uint8_t  byte_val = src0->data.y[i * ct_stride_bytes(src0) + xShftd / 8] |
+                                src1->data.y[i * ct_stride_bytes(src1) + xShftd / 8];
+            dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~mask) | (byte_val & mask);
+        }
+}
+
+static void referenceXor(CT_Image src0, CT_Image src1, CT_Image dst)
+{
+    uint32_t i, j;
+
+    ASSERT(src0 && src1 && dst);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
+    ASSERT(src0->format == dst->format && src1->format == dst->format && dst->format == VX_DF_IMAGE_U1);
+
+    for (i = 0; i < dst->height; ++i)
+        for (j = 0; j < dst->width; ++j)
+        {
+            uint32_t xShftd = j + src0->roi.x % 8;
+            uint8_t  mask   = 1 << (xShftd % 8);
+            uint8_t  byte_val = src0->data.y[i * ct_stride_bytes(src0) + xShftd / 8] ^
+                                src1->data.y[i * ct_stride_bytes(src1) + xShftd / 8];
+            dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~mask) | (byte_val & mask);
+        }
+}
+
+typedef vx_status (VX_API_CALL *vxuBinopFunction)(vx_context, vx_image, vx_image, vx_image);
+typedef vx_node   (VX_API_CALL *vxBinopFunction) (vx_graph, vx_image, vx_image, vx_image);
+typedef void      (*referenceFunction)(CT_Image, CT_Image, CT_Image);
+
+TESTCASE(vxuBinOp1u, CT_VXContext, ct_setup_vx_context, 0)
+TESTCASE(vxBinOp1u,  CT_VXContext, ct_setup_vx_context, 0)
+
+typedef struct {
+    const char* name;
+    vxuBinopFunction  vxuFunc;
+    vxBinopFunction   vxFunc;
+    referenceFunction referenceFunc;
+} func_arg;
+
+#define FUNC_ARG(func) ARG("_U1_/" #func, vxu##func, vx##func##Node, reference##func)
+
+TEST_WITH_ARG(vxuBinOp1u, testNegativeSizes, func_arg, FUNC_ARG(And), FUNC_ARG(Or), FUNC_ARG(Xor))
+{
+    vx_image src1_32x32, src1_64x64, src2_32x32, src2_32x64, dst32x32, dst88x16;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(src1_32x32 = vxCreateImage(context, 32, 32, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src1_64x64 = vxCreateImage(context, 64, 64, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2_32x32 = vxCreateImage(context, 32, 32, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2_32x64 = vxCreateImage(context, 32, 64, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(dst32x32 = vxCreateImage(context, 32, 32, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst88x16 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    // initialize to guarantee that images are allocated
+    ASSERT_NO_FAILURE(ct_fill_image_random(src1_32x32, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src1_64x64, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src2_32x32, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src2_32x64, &CT()->seed_));
+
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, arg_->vxuFunc(context, src1_32x32, src2_32x32, dst88x16));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, arg_->vxuFunc(context, src1_32x32, src2_32x64, dst32x32));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, arg_->vxuFunc(context, src1_64x64, src2_32x32, dst32x32));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, arg_->vxuFunc(context, src1_64x64, src2_32x64, dst32x32));
+
+    VX_CALL(vxReleaseImage(&src1_32x32));
+    VX_CALL(vxReleaseImage(&src2_32x32));
+    VX_CALL(vxReleaseImage(&src1_64x64));
+    VX_CALL(vxReleaseImage(&src2_32x64));
+    VX_CALL(vxReleaseImage(&dst32x32));
+    VX_CALL(vxReleaseImage(&dst88x16));
+}
+
+TEST_WITH_ARG(vxBinOp1u, testNegativeSizes, func_arg, FUNC_ARG(And), FUNC_ARG(Or), FUNC_ARG(Xor))
+{
+    vx_image src1_32x32, src1_64x64, src2_32x32, src2_32x64, dst32x32, dst88x16;
+    vx_graph graph1, graph2, graph3, graph4;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(src1_32x32 = vxCreateImage(context, 32, 32, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src1_64x64 = vxCreateImage(context, 64, 64, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2_32x32 = vxCreateImage(context, 32, 32, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2_32x64 = vxCreateImage(context, 32, 64, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(dst32x32 = vxCreateImage(context, 32, 32, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst88x16 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph1 = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(arg_->vxFunc(graph1, src1_32x32, src2_32x32, dst88x16), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph1));
+
+    ASSERT_VX_OBJECT(graph2 = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(arg_->vxFunc(graph2, src1_32x32, src2_32x64, dst32x32), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph2));
+
+    ASSERT_VX_OBJECT(graph3 = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(arg_->vxFunc(graph3, src1_64x64, src2_32x32, dst32x32), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph3));
+
+    ASSERT_VX_OBJECT(graph4 = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(arg_->vxFunc(graph4, src1_64x64, src2_32x64, dst32x32), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph4));
+
+    VX_CALL(vxReleaseImage(&src1_32x32));
+    VX_CALL(vxReleaseImage(&src2_32x32));
+    VX_CALL(vxReleaseImage(&src1_64x64));
+    VX_CALL(vxReleaseImage(&src2_32x64));
+    VX_CALL(vxReleaseImage(&dst32x32));
+    VX_CALL(vxReleaseImage(&dst88x16));
+    VX_CALL(vxReleaseGraph(&graph1));
+    VX_CALL(vxReleaseGraph(&graph2));
+    VX_CALL(vxReleaseGraph(&graph3));
+    VX_CALL(vxReleaseGraph(&graph4));
+}
+
+static vx_image inference_image;
+static vx_action VX_CALLBACK inference_image_test(vx_node node)
+{
+    vx_uint32 width  = 0;
+    vx_uint32 height = 0;
+    vx_df_image format = 0;
+
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxQueryImage(inference_image, VX_IMAGE_WIDTH,   &width,   sizeof(width)));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxQueryImage(inference_image, VX_IMAGE_HEIGHT,  &height,  sizeof(height)));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxQueryImage(inference_image, VX_IMAGE_FORMAT,  &format,  sizeof(format)));
+
+    EXPECT_EQ_INT(640, width);
+    EXPECT_EQ_INT(480, height);
+    EXPECT_EQ_INT(VX_DF_IMAGE_U1, format);
+
+    return VX_ACTION_CONTINUE;
+}
+
+TEST_WITH_ARG(vxBinOp1u, testInference, func_arg, FUNC_ARG(And), FUNC_ARG(Or), FUNC_ARG(Xor))
+{
+    vx_image src1, src2, dst, srcU8, dstU8, gr;
+    vx_scalar sshift;
+    vx_int32 sval = 0;
+    vx_graph graph;
+    vx_node n, cn1, cn2, tmp;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(src1  = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2  = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst   = vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(n     = arg_->vxFunc(graph, src1, src2, dst), VX_TYPE_NODE);
+
+    // grounding (add doesn't support U1 images)
+    ASSERT_VX_OBJECT(srcU8 = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dstU8 = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(gr    = vxCreateImage(context, 640, 480, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(sshift = vxCreateScalar(context, VX_TYPE_INT32, &sval), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(cn1   = vxConvertDepthNode(graph, src2, srcU8, VX_CONVERT_POLICY_SATURATE, sshift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(cn2   = vxConvertDepthNode(graph, dst,  dstU8, VX_CONVERT_POLICY_SATURATE, sshift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(tmp   = vxAddNode(graph, dstU8, srcU8, VX_CONVERT_POLICY_WRAP, gr), VX_TYPE_NODE);
+
+    // test
+    inference_image = dst;
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxAssignNodeCallback(n, inference_image_test));
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseNode(&n));
+    VX_CALL(vxReleaseNode(&cn1));
+    VX_CALL(vxReleaseNode(&cn2));
+    VX_CALL(vxReleaseNode(&tmp));
+    VX_CALL(vxReleaseScalar(&sshift));
+    VX_CALL(vxReleaseImage(&src1));
+    VX_CALL(vxReleaseImage(&src2));
+    VX_CALL(vxReleaseImage(&dst));
+    VX_CALL(vxReleaseImage(&srcU8));
+    VX_CALL(vxReleaseImage(&dstU8));
+    VX_CALL(vxReleaseImage(&gr));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+typedef struct {
+    const char* name;
+    uint32_t width;
+    uint32_t height;
+    vxuBinopFunction  vxuFunc;
+    vxBinopFunction   vxFunc;
+    referenceFunction referenceFunc;
+} fuzzy_arg;
+
+#define FUZZY_ARG(func,w,h) ARG("_U1_/" #func ": " #w "x" #h, w, h, vxu##func, vx##func##Node, reference##func)
+
+#define BINOP_SIZE_ARGS(func)       \
+    FUZZY_ARG(func, 640, 480),      \
+    ARG_EXTENDED_BEGIN(),           \
+    FUZZY_ARG(func, 1, 1),          \
+    FUZZY_ARG(func, 15, 17),        \
+    FUZZY_ARG(func, 32, 32),        \
+    FUZZY_ARG(func, 1231, 1234),    \
+    FUZZY_ARG(func, 1280, 720),     \
+    FUZZY_ARG(func, 1920, 1080),    \
+    ARG_EXTENDED_END()
+
+TEST_WITH_ARG(vxuBinOp1u, testFuzzy, fuzzy_arg, BINOP_SIZE_ARGS(And), BINOP_SIZE_ARGS(Or), BINOP_SIZE_ARGS(Xor))
+{
+    vx_image src1, src2, dst;
+    CT_Image ref1, ref2, refdst, vxdst;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(src1 = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2 = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst  = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(ct_fill_image_random(src1, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src2, &CT()->seed_));
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, arg_->vxuFunc(context, src1, src2, dst));
+
+    ref1  = ct_image_from_vx_image(src1);
+    ref2  = ct_image_from_vx_image(src2);
+    vxdst = ct_image_from_vx_image(dst);
+    refdst = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U1);
+
+    arg_->referenceFunc(ref1, ref2, refdst);
+
+    ASSERT_EQ_CTIMAGE(refdst, vxdst);
+
+    // checked release vx images
+    VX_CALL(vxReleaseImage(&dst));
+    VX_CALL(vxReleaseImage(&src1));
+    VX_CALL(vxReleaseImage(&src2));
+    EXPECT_EQ_PTR(NULL, dst);
+    EXPECT_EQ_PTR(NULL, src1);
+    EXPECT_EQ_PTR(NULL, src2);
+}
+
+TEST_WITH_ARG(vxBinOp1u, testFuzzy, fuzzy_arg, BINOP_SIZE_ARGS(And), BINOP_SIZE_ARGS(Or), BINOP_SIZE_ARGS(Xor))
+{
+    vx_image src1, src2, dst;
+    vx_graph graph;
+    CT_Image ref1, ref2, refdst, vxdst;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(dst   = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(src1 = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2 = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(ct_fill_image_random(src1, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src2, &CT()->seed_));
+
+    // build one-node graph
+    ASSERT_VX_OBJECT(arg_->vxFunc(graph, src1, src2, dst), VX_TYPE_NODE);
+
+    // run graph
+#ifdef CT_EXECUTE_ASYNC
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxScheduleGraph(graph));
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxWaitGraph(graph));
+#else
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxProcessGraph(graph));
+#endif
+
+    ref1  = ct_image_from_vx_image(src1);
+    ref2  = ct_image_from_vx_image(src2);
+    vxdst = ct_image_from_vx_image(dst);
+    refdst = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U1);
+
+    arg_->referenceFunc(ref1, ref2, refdst);
+
+    ASSERT_EQ_CTIMAGE(refdst, vxdst);
+
+    VX_CALL(vxReleaseImage(&src1));
+    VX_CALL(vxReleaseImage(&src2));
+    VX_CALL(vxReleaseImage(&dst));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TESTCASE_TESTS(vxuBinOp1u, DISABLED_testNegativeSizes,                testFuzzy)
+TESTCASE_TESTS(vxBinOp1u,  DISABLED_testNegativeSizes, testInference, testFuzzy)
+
+#endif //OPENVX_USE_U1
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_binop8u.c b/test_conformance/test_binop8u.c
index 9eb71dd..69add61 100644
--- a/test_conformance/test_binop8u.c
+++ b/test_conformance/test_binop8u.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -27,8 +29,8 @@
     uint32_t i, j;
 
     ASSERT(src0 && src1 && dst);
-    ASSERT(src0->width = src1->width && src0->width == dst->width);
-    ASSERT(src0->height = src1->height && src0->height == dst->height);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
     ASSERT(src0->format == dst->format && src1->format == dst->format && dst->format == VX_DF_IMAGE_U8);
 
     for (i = 0; i < dst->height; ++i)
@@ -44,8 +46,8 @@
     uint32_t i, j;
 
     ASSERT(src0 && src1 && dst);
-    ASSERT(src0->width = src1->width && src0->width == dst->width);
-    ASSERT(src0->height = src1->height && src0->height == dst->height);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
     ASSERT(src0->format == dst->format && src1->format == dst->format && dst->format == VX_DF_IMAGE_U8);
 
     for (i = 0; i < dst->height; ++i)
@@ -58,8 +60,8 @@
     uint32_t i, j;
 
     ASSERT(src0 && src1 && dst);
-    ASSERT(src0->width = src1->width && src0->width == dst->width);
-    ASSERT(src0->height = src1->height && src0->height == dst->height);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
     ASSERT(src0->format == dst->format && src1->format == dst->format && dst->format == VX_DF_IMAGE_U8);
 
     for (i = 0; i < dst->height; ++i)
@@ -72,8 +74,8 @@
     uint32_t i, j;
 
     ASSERT(src0 && src1 && dst);
-    ASSERT(src0->width = src1->width && src0->width == dst->width);
-    ASSERT(src0->height = src1->height && src0->height == dst->height);
+    ASSERT(src0->width == src1->width && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
     ASSERT(src0->format == dst->format && src1->format == dst->format && dst->format == VX_DF_IMAGE_U8);
 
     for (i = 0; i < dst->height; ++i)
@@ -320,3 +322,5 @@
 
 TESTCASE_TESTS(vxuBinOp8u, DISABLED_testNegativeSizes,                testFuzzy)
 TESTCASE_TESTS(vxBinOp8u,  DISABLED_testNegativeSizes, testInference, testFuzzy)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_box3x3.c b/test_conformance/test_box3x3.c
index 3c23046..c33582e 100644
--- a/test_conformance/test_box3x3.c
+++ b/test_conformance/test_box3x3.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -347,3 +349,5 @@
 }
 
 TESTCASE_TESTS(Box3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_canny.c b/test_conformance/test_canny.c
index dbdec3f..5f77ade 100644
--- a/test_conformance/test_canny.c
+++ b/test_conformance/test_canny.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,17 +15,21 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <stdint.h>
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
-#define USE_OPENCV_GENERATED_REFERENCE
+// #define USE_OPENCV_GENERATED_REFERENCE
+#ifndef USE_OPENCV_GENERATED_REFERENCE
+    #include <string.h>
+#endif
 #define CANNY_ACCEPTANCE_THRESHOLD 0.95
 //#define EXECUTE_ASYNC
 
-
 #define CREF_EDGE 2
 #define CREF_LINK 1
 #define CREF_NONE 0
@@ -93,7 +97,7 @@
     ASSERT(src && dst);
     ASSERT(src->width == dst->width);
     ASSERT(src->height == dst->height);
-    ASSERT(src->format == dst->format && src->format == VX_DF_IMAGE_U8);
+    ASSERT(src->format == VX_DF_IMAGE_U8 && (dst->format == VX_DF_IMAGE_U8 || dst->format == VX_DF_IMAGE_U1));
 
     ASSERT(low_thresh <= high_thresh);
     ASSERT(low_thresh >= 0);
@@ -101,18 +105,24 @@
     ASSERT(norm == VX_NORM_L2 || norm == VX_NORM_L1);
     ASSERT(src->width >= gsz && src->height >= gsz);
 
+    CT_Image tmp;
+    if (dst->format == VX_DF_IMAGE_U1)
+        tmp = ct_allocate_image(dst->width, dst->height, VX_DF_IMAGE_U8);
+    else
+        tmp = dst;
+
     // zero border pixels
     for (j = 0; j < bsz; ++j)
-        for (i = 0; i < dst->width; ++i)
-            dst->data.y[j * dst->stride + i] = dst->data.y[(dst->height - 1 - j) * dst->stride + i] = 255;
-    for (j = bsz; j < dst->height - bsz; ++j)
+        for (i = 0; i < tmp->width; ++i)
+            tmp->data.y[j * tmp->stride + i] = tmp->data.y[(tmp->height - 1 - j) * tmp->stride + i] = 255;
+    for (j = bsz; j < tmp->height - bsz; ++j)
         for (i = 0; i < bsz; ++i)
-            dst->data.y[j * dst->stride + i] = dst->data.y[j * dst->stride + dst->width - 1 - i] = 255;
+            tmp->data.y[j * tmp->stride + i] = tmp->data.y[j * tmp->stride + tmp->width - 1 - i] = 255;
 
     // threshold + nms
-    for (j = bsz; j < dst->height - bsz; ++j)
+    for (j = bsz; j < tmp->height - bsz; ++j)
     {
-        for (i = bsz; i < dst->width - bsz; ++i)
+        for (i = bsz; i < tmp->width - bsz; ++i)
         {
             int32_t dx, dy, e = CREF_NONE;
             uint64_t m1, m2;
@@ -144,21 +154,26 @@
                     e = (m > hi ? CREF_EDGE : CREF_LINK);
             }
 
-            dst->data.y[j * src->stride + i] = e;
+            tmp->data.y[j * tmp->stride + i] = e;
         }
     }
 
     // trace edges
-    for (j = bsz; j < dst->height - bsz; ++j)
-        for (i = bsz; i < dst->width - bsz; ++i)
-            if(dst->data.y[j * dst->stride + i] == CREF_EDGE)
-                follow_edge(dst, i, j);
+    for (j = bsz; j < tmp->height - bsz; ++j)
+        for (i = bsz; i < tmp->width - bsz; ++i)
+            if(tmp->data.y[j * tmp->stride + i] == CREF_EDGE)
+                follow_edge(tmp, i, j);
 
     // clear non-edges
-    for (j = bsz; j < dst->height - bsz; ++j)
-        for (i = bsz; i < dst->width - bsz; ++i)
-            if(dst->data.y[j * dst->stride + i] < 255)
-                dst->data.y[j * dst->stride + i] = 0;
+    for (j = bsz; j < tmp->height - bsz; ++j)
+        for (i = bsz; i < tmp->width - bsz; ++i)
+            if(tmp->data.y[j * tmp->stride + i] < 255)
+                tmp->data.y[j * tmp->stride + i] = 0;
+
+    if (dst->format == VX_DF_IMAGE_U1)
+    {
+        U8_ct_image_to_U1_ct_image(tmp, dst);
+    }
 }
 #endif
 
@@ -170,18 +185,42 @@
     ASSERT_(return 0, src && dst && dist && total_edge_pixels);
     ASSERT_(return 0, src->width == dst->width && src->width == dist->width);
     ASSERT_(return 0, src->height == dst->height && src->height == dist->height);
-    ASSERT_(return 0, src->format == dst->format && src->format == dist->format && src->format == VX_DF_IMAGE_U8);
+    ASSERT_(return 0, dist->format == VX_DF_IMAGE_U8 &&
+                      (src->format == VX_DF_IMAGE_U8 || src->format == VX_DF_IMAGE_U1) &&
+                      (dst->format == VX_DF_IMAGE_U8 || dst->format == VX_DF_IMAGE_U1));
 
     // fill borders with 1 (or 0 for edges)
     for (i = 0; i < dst->width; ++i)
     {
-        dist->data.y[i] = src->data.y[i] == 0 ? 1 : 0;
-        dist->data.y[(dist->height - 1) * dist->stride + i] = src->data.y[(dist->height - 1) * src->stride + i] == 0 ? 1 : 0;
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            uint32_t xShftd = i + src->roi.x % 8;
+            dist->data.y[i] =
+                (src->data.y[xShftd / 8] & (1 << (xShftd % 8))) == 0 ? 1 : 0;
+            dist->data.y[(dist->height - 1) * dist->stride + i] =
+                (src->data.y[(dist->height - 1) * ct_stride_bytes(src) + xShftd / 8] & (1 << (xShftd % 8))) == 0 ? 1 : 0;
+        }
+        else
+        {
+            dist->data.y[i] = src->data.y[i] == 0 ? 1 : 0;
+            dist->data.y[(dist->height - 1) * dist->stride + i] = src->data.y[(dist->height - 1) * src->stride + i] == 0 ? 1 : 0;
+        }
     }
     for (j = 1; j < dst->height - 1; ++j)
     {
-        dist->data.y[j * dist->stride] = src->data.y[j * src->stride] == 0 ? 1 : 0;
-        dist->data.y[j * dist->stride + dist->width - 1] = src->data.y[j * src->stride + dist->width - 1] == 0 ? 1 : 0;
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            uint32_t xShftd = src->roi.x % 8;
+            dist->data.y[j * dist->stride] =
+                (src->data.y[j * ct_stride_bytes(src) + xShftd / 8] & (1 << (xShftd % 8))) == 0 ? 1 : 0;
+            dist->data.y[j * dist->stride + dist->width - 1] =
+                (src->data.y[j * ct_stride_bytes(src) + (xShftd + dist->width - 1) / 8] & (1 << ((xShftd + dist->width - 1) % 8))) == 0 ? 1 : 0;
+        }
+        else
+        {
+            dist->data.y[j * dist->stride] = src->data.y[j * src->stride] == 0 ? 1 : 0;
+            dist->data.y[j * dist->stride + dist->width - 1] = src->data.y[j * src->stride + dist->width - 1] == 0 ? 1 : 0;
+        }
     }
 
     // minimalistic variant of disttransform:
@@ -192,14 +231,21 @@
     {
         for (i = 1; i < src->width-1; ++i)
         {
-            if (src->data.y[j * src->stride + i] != 0)
+            uint32_t xShftd = i + src->roi.x % 8;    // Shift for U1 images to account for ROI
+            if ( src->format == VX_DF_IMAGE_U1
+                 ? (src->data.y[j * ct_stride_bytes(src) + xShftd / 8] & (1 << (xShftd % 8))) != 0
+                 :  src->data.y[j * src->stride + i] != 0
+               )
                 dist->data.y[j * dist->stride + i] = 0;
             else
             {
                 int has_edge = 0;
                 for (k = 0; k < sizeof(offsets)/sizeof(offsets[0]); ++k)
                 {
-                    if (src->data.y[(j + offsets[k][1]) * src->stride + i + offsets[k][0]] != 0)
+                    if ( src->format == VX_DF_IMAGE_U1
+                         ? (src->data.y[(j + offsets[k][1]) * ct_stride_bytes(src) + (xShftd + offsets[k][0]) / 8] & (1 << (xShftd + offsets[k][0]) % 8)) != 0
+                         : src->data.y[(j + offsets[k][1]) * src->stride +  i + offsets[k][0]] != 0
+                       )
                     {
                         has_edge = 1;
                         break;
@@ -211,13 +257,15 @@
         }
     }
 
-    // count pixels where disttransform(src) < 2 and dst != 0
+    // count: pixels where disttransform(src) < 2 and dst != 0
     total = count = 0;
     for (j = 0; j < dst->height; ++j)
     {
         for (i = 0; i < dst->width; ++i)
         {
-            if (dst->data.y[j * dst->stride + i] != 0)
+            uint32_t xShftd = i + dst->roi.x % 8;
+            if ( dst->format == VX_DF_IMAGE_U1 ? (dst->data.y[j * ct_stride_bytes(dst) + xShftd / 8] & (1 << (xShftd % 8))) != 0
+                                               :  dst->data.y[j * dst->stride + i] != 0 )
             {
                 total += 1;
                 count += (dist->data.y[j * dist->stride + i] < 2) ? 1 : 0;
@@ -304,17 +352,25 @@
 }
 */
 
-static CT_Image get_reference_result(const char* src_name, CT_Image src, int32_t low_thresh, int32_t high_thresh, uint32_t gsz, vx_enum norm)
+static CT_Image get_reference_result(const char* src_name, CT_Image src, int32_t low_thresh, int32_t high_thresh, uint32_t gsz, vx_enum norm, vx_df_image out_format)
 {
 #ifdef USE_OPENCV_GENERATED_REFERENCE
+    CT_Image tmp_dst, dst;
     char buff[1024];
     sprintf(buff, "canny_%ux%u_%d_%d_%s_%s", gsz, gsz, low_thresh, high_thresh, norm == VX_NORM_L1 ? "L1" : "L2", src_name);
     // printf("reading: %s\n", buff);
-    return ct_read_image(buff, 1);
+
+    tmp_dst = ct_read_image(buff, 1);
+    if ( out_format == VX_DF_IMAGE_U1 && (dst = ct_allocate_image(tmp_dst->width, tmp_dst->height, VX_DF_IMAGE_U1)) )
+        U8_ct_image_to_U1_ct_image(tmp_dst, dst);
+    else
+        dst = tmp_dst;
+
+    return dst;
 #else
     CT_Image dst;
     ASSERT_(return 0, src);
-    if (dst = ct_allocate_image(src->width, src->height, VX_DF_IMAGE_U8))
+    if ( (dst = ct_allocate_image(src->width, src->height, out_format)) )
         reference_canny(src, dst, low_thresh, high_thresh, gsz, norm);
     return dst;
 #endif
@@ -330,45 +386,69 @@
     vx_enum norm_type;
     int32_t low_thresh;
     int32_t high_thresh;
+    vx_df_image out_format;
 } canny_arg;
 
-#define BIT_EXACT_ARG(grad, thresh) ARG(#grad "x" #grad " thresh=" #thresh, "lena_gray.bmp", grad, VX_NORM_L1, thresh, thresh)
-#define DIS_BIT_EXACT_ARG(grad, thresh) ARG("DISABLED_" #grad "x" #grad " thresh=" #thresh, "lena_gray.bmp", grad, VX_NORM_L1, thresh, thresh)
+#define BIT_EXACT_ARG_U8(grad, thresh) ARG(#grad "x" #grad " thresh=" #thresh " output=VX_DF_IMAGE_U8", "lena_gray.bmp", grad, VX_NORM_L1, thresh, thresh, VX_DF_IMAGE_U8)
+#define BIT_EXACT_ARG_U1(grad, thresh) ARG("_U1_/" #grad "x" #grad " thresh=" #thresh " output=VX_DF_IMAGE_U1", "lena_gray.bmp", grad, VX_NORM_L1, thresh, thresh, VX_DF_IMAGE_U1)
 
-TEST_WITH_ARG(vxuCanny, BitExactL1, canny_arg, BIT_EXACT_ARG(3, 120), BIT_EXACT_ARG(5, 100), /* DIS_BIT_EXACT_ARG(7, 80 do not enable this argument) */)
+TEST_WITH_ARG(vxuCanny, BitExactL1, canny_arg,
+    BIT_EXACT_ARG_U8(3, 120),
+    BIT_EXACT_ARG_U8(5, 100),
+    BIT_EXACT_ARG_U1(3, 120),
+    BIT_EXACT_ARG_U1(5, 100)
+    )
 {
     vx_image src, dst;
     vx_threshold hyst;
     CT_Image lena, vxdst, refdst;
     vx_int32 low_thresh  = arg_->low_thresh;
     vx_int32 high_thresh = arg_->high_thresh;
-    vx_int32 false_val = 0;
-    vx_int32 true_val = 255;
     vx_border_t border = { VX_BORDER_UNDEFINED, {{ 0 }} };
     vx_int32 border_width = arg_->grad_size/2 + 1;
+    vx_df_image output_format = arg_->out_format;
     vx_context context = context_->vx_context_;
+    vx_df_image input_format = VX_DF_IMAGE_U8;
+    vx_pixel_value_t low_pixel;
+    vx_pixel_value_t high_pixel;
+    memset(&low_pixel, 0, sizeof(low_pixel));
+    memset(&high_pixel, 0, sizeof(high_pixel));
+    low_pixel.U8 = low_thresh;
+    high_pixel.U8 = high_thresh;
+
+    ASSERT((output_format == VX_DF_IMAGE_U8) || (output_format == VX_DF_IMAGE_U1));
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
 
     ASSERT_NO_FAILURE(lena = get_source_image(arg_->filename));
     ASSERT_NO_FAILURE(src = ct_image_to_vx_image(lena, context));
-    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, output_format), VX_TYPE_IMAGE);
 
-    ASSERT_VX_OBJECT(hyst = vxCreateThreshold(context, VX_THRESHOLD_TYPE_RANGE, VX_TYPE_UINT8), VX_TYPE_THRESHOLD);
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_LOWER, &low_thresh,  sizeof(low_thresh)));
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_UPPER, &high_thresh, sizeof(high_thresh)));
+    ASSERT_VX_OBJECT(hyst = vxCreateThresholdForImage(context, VX_THRESHOLD_TYPE_RANGE, input_format, output_format), VX_TYPE_THRESHOLD);
+    VX_CALL(vxCopyThresholdRange(hyst, &low_pixel, &high_pixel, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
     /* explicitly set FALSE_VALUE and TRUE_VALUE for hyst parameter */
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_FALSE_VALUE, &false_val, sizeof(false_val)));
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_TRUE_VALUE, &true_val, sizeof(true_val)));
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxuCannyEdgeDetector(context, src, hyst, arg_->grad_size, arg_->norm_type, dst));
 
     ASSERT_NO_FAILURE(vxdst = ct_image_from_vx_image(dst));
-    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size, arg_->norm_type));
+    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size,
+                                                    arg_->norm_type, output_format));
 
     ASSERT_NO_FAILURE(ct_adjust_roi(vxdst,  border_width, border_width, border_width, border_width));
     ASSERT_NO_FAILURE(ct_adjust_roi(refdst, border_width, border_width, border_width, border_width));
 
+#if 0
+    printf("=== SRC ===\n");
+    ct_dump_image_info(lena);
+    printf("=== VX ===\n");
+    ct_dump_image_info(vxdst);
+    printf("=== REF ===\n");
+    ct_dump_image_info(refdst);
+    ct_write_image("canny_src.bmp",  lena);
+    ct_write_image("canny_res_vx.bmp", vxdst);
+    ct_write_image("canny_res_ref.bmp",  refdst);
+#endif
+
     ASSERT_EQ_CTIMAGE(refdst, vxdst);
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseThreshold(&hyst));
@@ -376,7 +456,12 @@
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseImage(&dst));
 }
 
-TEST_WITH_ARG(vxCanny, BitExactL1, canny_arg, BIT_EXACT_ARG(3, 120), BIT_EXACT_ARG(5, 100), /* DIS_BIT_EXACT_ARG(7, 80 do not enable this argument) */)
+TEST_WITH_ARG(vxCanny, BitExactL1, canny_arg,
+    BIT_EXACT_ARG_U8(3, 120),
+    BIT_EXACT_ARG_U8(5, 100),
+    BIT_EXACT_ARG_U1(3, 120),
+    BIT_EXACT_ARG_U1(5, 100)
+    )
 {
     vx_image src, dst;
     vx_graph graph;
@@ -385,22 +470,27 @@
     CT_Image lena, vxdst, refdst;
     vx_int32 low_thresh  = arg_->low_thresh;
     vx_int32 high_thresh = arg_->high_thresh;
-    vx_int32 false_val = 0;
-    vx_int32 true_val = 255;
     vx_border_t border = { VX_BORDER_UNDEFINED, {{ 0 }} };
     vx_int32 border_width = arg_->grad_size/2 + 1;
+    vx_df_image output_format = arg_->out_format;
     vx_context context = context_->vx_context_;
+    vx_df_image input_format = VX_DF_IMAGE_U8;
+    vx_pixel_value_t low_pixel;
+    vx_pixel_value_t high_pixel;
+    memset(&low_pixel, 0, sizeof(low_pixel));
+    memset(&high_pixel, 0, sizeof(high_pixel));
+    low_pixel.U8 = low_thresh;
+    high_pixel.U8 = high_thresh;
+
+    ASSERT((output_format == VX_DF_IMAGE_U8) || (output_format == VX_DF_IMAGE_U1));
 
     ASSERT_NO_FAILURE(lena = get_source_image(arg_->filename));
     ASSERT_NO_FAILURE(src = ct_image_to_vx_image(lena, context));
-    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, output_format), VX_TYPE_IMAGE);
 
-    ASSERT_VX_OBJECT(hyst = vxCreateThreshold(context, VX_THRESHOLD_TYPE_RANGE, VX_TYPE_UINT8), VX_TYPE_THRESHOLD);
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_LOWER, &low_thresh,  sizeof(low_thresh)));
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_UPPER, &high_thresh, sizeof(high_thresh)));
+    ASSERT_VX_OBJECT(hyst = vxCreateThresholdForImage(context, VX_THRESHOLD_TYPE_RANGE, input_format, output_format), VX_TYPE_THRESHOLD);
+    VX_CALL(vxCopyThresholdRange(hyst, &low_pixel, &high_pixel, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
     /* explicitly set FALSE_VALUE and TRUE_VALUE for hyst parameter */
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_FALSE_VALUE, &false_val, sizeof(false_val)));
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_TRUE_VALUE, &true_val, sizeof(true_val)));
 
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
     ASSERT_VX_OBJECT(node = vxCannyEdgeDetectorNode(graph, src, hyst, arg_->grad_size, arg_->norm_type, dst), VX_TYPE_NODE);
@@ -416,7 +506,8 @@
 #endif
 
     ASSERT_NO_FAILURE(vxdst = ct_image_from_vx_image(dst));
-    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size, arg_->norm_type));
+    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size,
+                                                    arg_->norm_type, output_format));
 
     ASSERT_NO_FAILURE(ct_adjust_roi(vxdst,  border_width, border_width, border_width, border_width));
     ASSERT_NO_FAILURE(ct_adjust_roi(refdst, border_width, border_width, border_width, border_width));
@@ -424,6 +515,18 @@
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseNode(&node));
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseGraph(&graph));
 
+#if 0
+    printf("=== SRC ===\n");
+    ct_dump_image_info(lena);
+    printf("=== VX ===\n");
+    ct_dump_image_info(vxdst);
+    printf("=== REF ===\n");
+    ct_dump_image_info(refdst);
+    ct_write_image("canny_src.bmp",  lena);
+    ct_write_image("canny_res_vx.bmp", vxdst);
+    ct_write_image("canny_res_ref.bmp",  refdst);
+#endif
+
     ASSERT_EQ_CTIMAGE(refdst, vxdst);
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseThreshold(&hyst));
@@ -431,41 +534,71 @@
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseImage(&dst));
 }
 
-#define CANNY_ARG(grad, norm, lo, hi, file) ARG(#file "/" #norm " " #grad "x" #grad " thresh=(" #lo ", " #hi ")", #file ".bmp", grad, VX_NORM_##norm, lo, hi)
-#define DISABLED_CANNY_ARG(grad, norm, lo, hi, file) ARG("DISABLED_" #file "/" #norm " " #grad "x" #grad " thresh=(" #lo ", " #hi ")", #file ".bmp", grad, VX_NORM_##norm, lo, hi)
+#define CANNY_ARG_U8(grad, norm, lo, hi, file) ARG(#file "/" #norm " " #grad "x" #grad " thresh=(" #lo ", " #hi ") output=VX_DF_IMAGE_U8", #file ".bmp", grad, VX_NORM_##norm, lo, hi, VX_DF_IMAGE_U8)
+#define CANNY_ARG_U1(grad, norm, lo, hi, file) ARG("_U1_/" #file "/" #norm " " #grad "x" #grad " thresh=(" #lo ", " #hi ") output=VX_DF_IMAGE_U1", #file ".bmp", grad, VX_NORM_##norm, lo, hi, VX_DF_IMAGE_U1)
 
 TEST_WITH_ARG(vxuCanny, Lena, canny_arg,
-    CANNY_ARG(3, L1, 100, 120, lena_gray),
-    CANNY_ARG(3, L2, 100, 120, lena_gray),
-    CANNY_ARG(3, L1, 90,  130, lena_gray),
-    CANNY_ARG(3, L2, 90,  130, lena_gray),
-    CANNY_ARG(3, L1, 70,  71 , lena_gray),
-    CANNY_ARG(3, L2, 70,  71 , lena_gray),
-    CANNY_ARG(3, L1, 150, 220, lena_gray),
-    CANNY_ARG(3, L2, 150, 220, lena_gray),
-    CANNY_ARG(5, L1, 100, 120, lena_gray),
-    CANNY_ARG(5, L2, 100, 120, lena_gray),
-    CANNY_ARG(7, L1, 100, 120, lena_gray),
-    CANNY_ARG(7, L2, 100, 120, lena_gray),
+    CANNY_ARG_U8(3, L1, 100, 120, lena_gray),
+    CANNY_ARG_U8(3, L2, 100, 120, lena_gray),
+    CANNY_ARG_U8(3, L1, 90,  130, lena_gray),
+    CANNY_ARG_U8(3, L2, 90,  130, lena_gray),
+    CANNY_ARG_U8(3, L1, 70,  71 , lena_gray),
+    CANNY_ARG_U8(3, L2, 70,  71 , lena_gray),
+    CANNY_ARG_U8(3, L1, 150, 220, lena_gray),
+    CANNY_ARG_U8(3, L2, 150, 220, lena_gray),
+    CANNY_ARG_U8(5, L1, 100, 120, lena_gray),
+    CANNY_ARG_U8(5, L2, 100, 120, lena_gray),
+    CANNY_ARG_U8(7, L1, 100, 120, lena_gray),
+    CANNY_ARG_U8(7, L2, 100, 120, lena_gray),
 
-    CANNY_ARG(5, L1, 1200, 1440, lena_gray),
-    CANNY_ARG(5, L2, 1200, 1440, lena_gray),
-    CANNY_ARG(7, L1, 16000, 19200, lena_gray),
-    CANNY_ARG(7, L2, 16000, 19200, lena_gray),
+    CANNY_ARG_U8(5, L1, 1200, 1440, lena_gray),
+    CANNY_ARG_U8(5, L2, 1200, 1440, lena_gray),
+    CANNY_ARG_U8(7, L1, 16000, 19200, lena_gray),
+    CANNY_ARG_U8(7, L2, 16000, 19200, lena_gray),
 
-    CANNY_ARG(3, L1, 100, 120, blurred_lena_gray),
-    CANNY_ARG(3, L2, 100, 120, blurred_lena_gray),
-    CANNY_ARG(3, L1, 90,  125, blurred_lena_gray),
-    CANNY_ARG(3, L2, 90,  130, blurred_lena_gray),
-    CANNY_ARG(3, L1, 70,  71 , blurred_lena_gray),
-    CANNY_ARG(3, L2, 70,  71 , blurred_lena_gray),
-    CANNY_ARG(3, L1, 150, 220, blurred_lena_gray),
-    CANNY_ARG(3, L2, 150, 220, blurred_lena_gray),
-    CANNY_ARG(5, L1, 100, 120, blurred_lena_gray),
-    CANNY_ARG(5, L2, 100, 120, blurred_lena_gray),
-    CANNY_ARG(7, L1, 100, 120, blurred_lena_gray),
-    CANNY_ARG(7, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 90,  125, blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 90,  130, blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U8(5, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(5, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(7, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(7, L2, 100, 120, blurred_lena_gray),
 
+    CANNY_ARG_U1(3, L1, 100, 120, lena_gray),
+    CANNY_ARG_U1(3, L2, 100, 120, lena_gray),
+    CANNY_ARG_U1(3, L1, 90,  130, lena_gray),
+    CANNY_ARG_U1(3, L2, 90,  130, lena_gray),
+    CANNY_ARG_U1(3, L1, 70,  71 , lena_gray),
+    CANNY_ARG_U1(3, L2, 70,  71 , lena_gray),
+    CANNY_ARG_U1(3, L1, 150, 220, lena_gray),
+    CANNY_ARG_U1(3, L2, 150, 220, lena_gray),
+    CANNY_ARG_U1(5, L1, 100, 120, lena_gray),
+    CANNY_ARG_U1(5, L2, 100, 120, lena_gray),
+    CANNY_ARG_U1(7, L1, 100, 120, lena_gray),
+    CANNY_ARG_U1(7, L2, 100, 120, lena_gray),
+
+    CANNY_ARG_U1(5, L1, 1200, 1440, lena_gray),
+    CANNY_ARG_U1(5, L2, 1200, 1440, lena_gray),
+    CANNY_ARG_U1(7, L1, 16000, 19200, lena_gray),
+    CANNY_ARG_U1(7, L2, 16000, 19200, lena_gray),
+
+    CANNY_ARG_U1(3, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(3, L1, 90,  125, blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 90,  130, blurred_lena_gray),
+    CANNY_ARG_U1(3, L1, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U1(3, L1, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U1(5, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(5, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(7, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(7, L2, 100, 120, blurred_lena_gray),
 )
 {
     uint32_t total, count;
@@ -476,27 +609,41 @@
     vx_int32 high_thresh = arg_->high_thresh;
     vx_border_t border = { VX_BORDER_UNDEFINED, {{ 0 }} };
     vx_int32 border_width = arg_->grad_size/2 + 1;
+    vx_df_image output_format = arg_->out_format;
     vx_context context = context_->vx_context_;
-    vx_enum thresh_data_type = VX_TYPE_UINT8;
+    vx_df_image input_format = VX_DF_IMAGE_U8;
+    vx_pixel_value_t low_pixel;
+    vx_pixel_value_t high_pixel;
+    memset(&low_pixel, 0, sizeof(low_pixel));
+    memset(&high_pixel, 0, sizeof(high_pixel));
+    low_pixel.U8 = low_thresh;
+    high_pixel.U8 = high_thresh;
     if (low_thresh > 255)
-        thresh_data_type = VX_TYPE_INT16;
+    {
+        input_format = VX_DF_IMAGE_S16;
+        low_pixel.S16 = low_thresh;
+        high_pixel.S16 = high_thresh;
+    }
+
+    ASSERT((output_format == VX_DF_IMAGE_U8) || (output_format == VX_DF_IMAGE_U1));
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
 
     ASSERT_NO_FAILURE(lena = get_source_image(arg_->filename));
     ASSERT_NO_FAILURE(src = ct_image_to_vx_image(lena, context));
-    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, output_format), VX_TYPE_IMAGE);
 
-    ASSERT_VX_OBJECT(hyst = vxCreateThreshold(context, VX_THRESHOLD_TYPE_RANGE, thresh_data_type), VX_TYPE_THRESHOLD);
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_LOWER, &low_thresh,  sizeof(low_thresh)));
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_UPPER, &high_thresh, sizeof(high_thresh)));
+    ASSERT_VX_OBJECT(hyst = vxCreateThresholdForImage(context, VX_THRESHOLD_TYPE_RANGE, input_format, output_format), VX_TYPE_THRESHOLD);
+    VX_CALL(vxCopyThresholdRange(hyst, &low_pixel, &high_pixel, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
     /* FALSE_VALUE and TRUE_VALUE of hyst parameter are set to their default values (0, 255) by vxCreateThreshold */
     /* test reference data are computed with assumption that FALSE_VALUE and TRUE_VALUE set to 0 and 255 */
+
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxuCannyEdgeDetector(context, src, hyst, arg_->grad_size, arg_->norm_type, dst));
 
     ASSERT_NO_FAILURE(vxdst = ct_image_from_vx_image(dst));
+    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size,
+                                                    arg_->norm_type, output_format));
 
-    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size, arg_->norm_type));
     ASSERT_NO_FAILURE(ct_adjust_roi(vxdst,  border_width, border_width, border_width, border_width));
     ASSERT_NO_FAILURE(ct_adjust_roi(refdst, border_width, border_width, border_width, border_width));
 
@@ -505,7 +652,7 @@
     // disttransform(x,y) < tolerance for all (x,y) such that output(x,y) = 255,
     // where disttransform is the distance transform image with Euclidean distance
     // of the reference(x,y) (canny edge ground truth). This condition should be
-    // satisfied by 98% of output edge pixels, tolerance = 2.
+    // satisfied by 95% of output edge pixels, tolerance = 2.
     ASSERT_NO_FAILURE(count = disttransform2_metric(refdst, vxdst, dist, &total));
 
     if (count < CANNY_ACCEPTANCE_THRESHOLD * total)
@@ -520,7 +667,7 @@
     // And the inverse: disttransform(x,y) < tolerance for all (x,y) such that
     // reference(x,y) = 255, where disttransform is the distance transform image
     // with Euclidean distance of the output(x,y) (canny edge ground truth). This
-    // condition should be satisfied by 98% of reference edge pixels, tolerance = 2.
+    // condition should be satisfied by 95% of reference edge pixels, tolerance = 2.
     ASSERT_NO_FAILURE(count = disttransform2_metric(vxdst, refdst, dist, &total));
 
     if (count < CANNY_ACCEPTANCE_THRESHOLD * total)
@@ -538,36 +685,67 @@
 }
 
 TEST_WITH_ARG(vxCanny, Lena, canny_arg,
-    CANNY_ARG(3, L1, 100, 120, lena_gray),
-    CANNY_ARG(3, L2, 100, 120, lena_gray),
-    CANNY_ARG(3, L1, 90,  130, lena_gray),
-    CANNY_ARG(3, L2, 90,  130, lena_gray),
-    CANNY_ARG(3, L1, 70,  71 , lena_gray),
-    CANNY_ARG(3, L2, 70,  71 , lena_gray),
-    CANNY_ARG(3, L1, 150, 220, lena_gray),
-    CANNY_ARG(3, L2, 150, 220, lena_gray),
-    CANNY_ARG(5, L1, 100, 120, lena_gray),
-    CANNY_ARG(5, L2, 100, 120, lena_gray),
-    CANNY_ARG(7, L1, 100, 120, lena_gray),
-    CANNY_ARG(7, L2, 100, 120, lena_gray),
+    CANNY_ARG_U8(3, L1, 100, 120, lena_gray),
+    CANNY_ARG_U8(3, L2, 100, 120, lena_gray),
+    CANNY_ARG_U8(3, L1, 90,  130, lena_gray),
+    CANNY_ARG_U8(3, L2, 90,  130, lena_gray),
+    CANNY_ARG_U8(3, L1, 70,  71 , lena_gray),
+    CANNY_ARG_U8(3, L2, 70,  71 , lena_gray),
+    CANNY_ARG_U8(3, L1, 150, 220, lena_gray),
+    CANNY_ARG_U8(3, L2, 150, 220, lena_gray),
+    CANNY_ARG_U8(5, L1, 100, 120, lena_gray),
+    CANNY_ARG_U8(5, L2, 100, 120, lena_gray),
+    CANNY_ARG_U8(7, L1, 100, 120, lena_gray),
+    CANNY_ARG_U8(7, L2, 100, 120, lena_gray),
 
-    CANNY_ARG(5, L1, 1200, 1440, lena_gray),
-    CANNY_ARG(5, L2, 1200, 1440, lena_gray),
-    CANNY_ARG(7, L1, 16000, 19200, lena_gray),
-    CANNY_ARG(7, L2, 16000, 19200, lena_gray),
+    CANNY_ARG_U8(5, L1, 1200, 1440, lena_gray),
+    CANNY_ARG_U8(5, L2, 1200, 1440, lena_gray),
+    CANNY_ARG_U8(7, L1, 16000, 19200, lena_gray),
+    CANNY_ARG_U8(7, L2, 16000, 19200, lena_gray),
 
-    CANNY_ARG(3, L1, 100, 120, blurred_lena_gray),
-    CANNY_ARG(3, L2, 100, 120, blurred_lena_gray),
-    CANNY_ARG(3, L1, 90,  125, blurred_lena_gray),
-    CANNY_ARG(3, L2, 90,  130, blurred_lena_gray),
-    CANNY_ARG(3, L1, 70,  71 , blurred_lena_gray),
-    CANNY_ARG(3, L2, 70,  71 , blurred_lena_gray),
-    CANNY_ARG(3, L1, 150, 220, blurred_lena_gray),
-    CANNY_ARG(3, L2, 150, 220, blurred_lena_gray),
-    CANNY_ARG(5, L1, 100, 120, blurred_lena_gray),
-    CANNY_ARG(5, L2, 100, 120, blurred_lena_gray),
-    CANNY_ARG(7, L1, 100, 120, blurred_lena_gray),
-    CANNY_ARG(7, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 90,  125, blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 90,  130, blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U8(3, L1, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U8(3, L2, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U8(5, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(5, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(7, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U8(7, L2, 100, 120, blurred_lena_gray),
+
+    CANNY_ARG_U1(3, L1, 100, 120, lena_gray),
+    CANNY_ARG_U1(3, L2, 100, 120, lena_gray),
+    CANNY_ARG_U1(3, L1, 90,  130, lena_gray),
+    CANNY_ARG_U1(3, L2, 90,  130, lena_gray),
+    CANNY_ARG_U1(3, L1, 70,  71 , lena_gray),
+    CANNY_ARG_U1(3, L2, 70,  71 , lena_gray),
+    CANNY_ARG_U1(3, L1, 150, 220, lena_gray),
+    CANNY_ARG_U1(3, L2, 150, 220, lena_gray),
+    CANNY_ARG_U1(5, L1, 100, 120, lena_gray),
+    CANNY_ARG_U1(5, L2, 100, 120, lena_gray),
+    CANNY_ARG_U1(7, L1, 100, 120, lena_gray),
+    CANNY_ARG_U1(7, L2, 100, 120, lena_gray),
+
+    CANNY_ARG_U1(5, L1, 1200, 1440, lena_gray),
+    CANNY_ARG_U1(5, L2, 1200, 1440, lena_gray),
+    CANNY_ARG_U1(7, L1, 16000, 19200, lena_gray),
+    CANNY_ARG_U1(7, L2, 16000, 19200, lena_gray),
+
+    CANNY_ARG_U1(3, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(3, L1, 90,  125, blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 90,  130, blurred_lena_gray),
+    CANNY_ARG_U1(3, L1, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 70,  71 , blurred_lena_gray),
+    CANNY_ARG_U1(3, L1, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U1(3, L2, 150, 220, blurred_lena_gray),
+    CANNY_ARG_U1(5, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(5, L2, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(7, L1, 100, 120, blurred_lena_gray),
+    CANNY_ARG_U1(7, L2, 100, 120, blurred_lena_gray),
 
 )
 {
@@ -581,18 +759,30 @@
     vx_int32 high_thresh = arg_->high_thresh;
     vx_border_t border = { VX_BORDER_UNDEFINED, {{ 0 }} };
     vx_int32 border_width = arg_->grad_size/2 + 1;
+    vx_df_image output_format = arg_->out_format;
     vx_context context = context_->vx_context_;
-    vx_enum thresh_data_type = VX_TYPE_UINT8;
+    vx_df_image input_format = VX_DF_IMAGE_U8;
+    vx_pixel_value_t low_pixel;
+    vx_pixel_value_t high_pixel;
+    memset(&low_pixel, 0, sizeof(low_pixel));
+    memset(&high_pixel, 0, sizeof(high_pixel));
+    low_pixel.U8 = low_thresh;
+    high_pixel.U8 = high_thresh;
     if (low_thresh > 255)
-        thresh_data_type = VX_TYPE_INT16;
+    {
+        input_format = VX_DF_IMAGE_S16;
+        low_pixel.S16 = low_thresh;
+        high_pixel.S16 = high_thresh;
+    }
+
+    ASSERT((output_format == VX_DF_IMAGE_U8) || (output_format == VX_DF_IMAGE_U1));
 
     ASSERT_NO_FAILURE(lena = get_source_image(arg_->filename));
     ASSERT_NO_FAILURE(src = ct_image_to_vx_image(lena, context));
-    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst = vxCreateImage(context, lena->width, lena->height, output_format), VX_TYPE_IMAGE);
 
-    ASSERT_VX_OBJECT(hyst = vxCreateThreshold(context, VX_THRESHOLD_TYPE_RANGE, thresh_data_type), VX_TYPE_THRESHOLD);
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_LOWER, &low_thresh,  sizeof(low_thresh)));
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxSetThresholdAttribute(hyst, VX_THRESHOLD_THRESHOLD_UPPER, &high_thresh, sizeof(high_thresh)));
+    ASSERT_VX_OBJECT(hyst = vxCreateThresholdForImage(context, VX_THRESHOLD_TYPE_RANGE, input_format, output_format), VX_TYPE_THRESHOLD);
+    VX_CALL(vxCopyThresholdRange(hyst, &low_pixel, &high_pixel, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
     /* FALSE_VALUE and TRUE_VALUE of hyst parameter are set to their default values (0, 255) by vxCreateThreshold */
     /* test reference data are computed with assumption that FALSE_VALUE and TRUE_VALUE set to 0 and 255 */
 
@@ -612,7 +802,8 @@
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseGraph(&graph));
 
     ASSERT_NO_FAILURE(vxdst = ct_image_from_vx_image(dst));
-    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size, arg_->norm_type));
+    ASSERT_NO_FAILURE(refdst = get_reference_result(arg_->filename, lena, low_thresh, high_thresh, arg_->grad_size,
+                                                    arg_->norm_type, output_format));
 
     ASSERT_NO_FAILURE(ct_adjust_roi(vxdst,  border_width, border_width, border_width, border_width));
     ASSERT_NO_FAILURE(ct_adjust_roi(refdst, border_width, border_width, border_width, border_width));
@@ -622,8 +813,9 @@
     // disttransform(x,y) < tolerance for all (x,y) such that output(x,y) = 255,
     // where disttransform is the distance transform image with Euclidean distance
     // of the reference(x,y) (canny edge ground truth). This condition should be
-    // satisfied by 98% of output edge pixels, tolerance = 2.
+    // satisfied by 95% of output edge pixels, tolerance = 2.
     ASSERT_NO_FAILURE(count = disttransform2_metric(refdst, vxdst, dist, &total));
+
     if (count < CANNY_ACCEPTANCE_THRESHOLD * total)
     {
         CT_RecordFailureAtFormat("disttransform(reference) < 2 only for %u of %u pixels of output edges which is %.2f%% < %.2f%%", __FUNCTION__, __FILE__, __LINE__,
@@ -636,7 +828,7 @@
     // And the inverse: disttransform(x,y) < tolerance for all (x,y) such that
     // reference(x,y) = 255, where disttransform is the distance transform image
     // with Euclidean distance of the output(x,y) (canny edge ground truth). This
-    // condition should be satisfied by 98% of reference edge pixels, tolerance = 2.
+    // condition should be satisfied by 95% of reference edge pixels, tolerance = 2.
     ASSERT_NO_FAILURE(count = disttransform2_metric(vxdst, refdst, dist, &total));
     if (count < CANNY_ACCEPTANCE_THRESHOLD * total)
     {
@@ -654,3 +846,5 @@
 
 TESTCASE_TESTS(vxuCanny, DISABLED_BitExactL1, Lena)
 TESTCASE_TESTS(vxCanny,  DISABLED_BitExactL1, Lena)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_channelcombine.c b/test_conformance/test_channelcombine.c
index 0171585..8e9ce53 100644
--- a/test_conformance/test_channelcombine.c
+++ b/test_conformance/test_channelcombine.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -307,3 +309,5 @@
         testGraphProcessing,
         testImmediateProcessing
 )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_channelextract.c b/test_conformance/test_channelextract.c
index ad7629c..4226f03 100644
--- a/test_conformance/test_channelextract.c
+++ b/test_conformance/test_channelextract.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -257,3 +259,5 @@
         testGraphProcessing,
         testImmediateProcessing
 )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_controlflow.c b/test_conformance/test_controlflow.c
index c3523c7..4153fa1 100644
--- a/test_conformance/test_controlflow.c
+++ b/test_conformance/test_controlflow.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include <math.h>
 #include <float.h>
 #include <VX/vx.h>
@@ -80,7 +82,7 @@
         vx_size stride = img_width*2;
         vx_size stride_y = sizeof(vx_coordinates2df_t) * (stride);
         vx_size size = stride * img_height*2;
-        vx_coordinates2df_t* ptr_w = malloc(sizeof(vx_coordinates2df_t) * size);
+        vx_coordinates2df_t* ptr_w = ct_alloc_mem(sizeof(vx_coordinates2df_t) * size);
         for (vx_size i = 0; i < img_height*2; i++)
         {
             for (vx_size j = 0; j < img_width*2; j++)
@@ -93,7 +95,7 @@
         vxCopyRemapPatch(remap, &rect, stride_y, ptr_w, VX_TYPE_COORDINATES2DF, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
 
         ref = (vx_reference)remap;
-        free(ptr_w);
+        ct_free_mem(ptr_w);
         break;
     }
     case VX_TYPE_LUT:
@@ -108,13 +110,13 @@
         vxReleaseScalar(&scalar);
         break;
     case VX_TYPE_TENSOR:
-        dims = malloc(tensor_dims_num * sizeof(vx_size));
+        dims = ct_alloc_mem(tensor_dims_num * sizeof(vx_size));
         for(vx_size i = 0; i < tensor_dims_num; i++)
         {
             dims[i] = tensor_dims_length;
         }
         ref = (vx_reference)vxCreateTensor(context, tensor_dims_num, dims, VX_TYPE_UINT8, 0);
-        free(dims);
+        ct_free_mem(dims);
         break;
     default:
         break;
@@ -482,62 +484,62 @@
     switch (result_type)
     {
     case VX_TYPE_CHAR:
-        VX_CALL(vxReadScalarValue(o, &o_value.chr));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.chr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.chr, o_value.chr);
         break;
 
     case VX_TYPE_INT8:
-        VX_CALL(vxReadScalarValue(o, &o_value.s08));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.s08, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.s08, o_value.s08);
         break;
 
     case VX_TYPE_UINT8:
-        VX_CALL(vxReadScalarValue(o, &o_value.u08));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.u08, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.u08, o_value.u08);
         break;
 
     case VX_TYPE_INT16:
-        VX_CALL(vxReadScalarValue(o, &o_value.s16));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.s16, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.s16, o_value.s16);
         break;
 
     case VX_TYPE_UINT16:
-        VX_CALL(vxReadScalarValue(o, &o_value.u16));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.u16, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.u16, o_value.u16);
         break;
 
     case VX_TYPE_INT32:
-        VX_CALL(vxReadScalarValue(o, &o_value.s32));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.s32, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.s32, o_value.s32);
         break;
 
     case VX_TYPE_UINT32:
-        VX_CALL(vxReadScalarValue(o, &o_value.u32));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.u32, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.u32, o_value.u32);
         break;
 
     case VX_TYPE_INT64:
-        VX_CALL(vxReadScalarValue(o, &o_value.s64));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.s64, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.s64, o_value.s64);
         break;
 
     case VX_TYPE_UINT64:
-        VX_CALL(vxReadScalarValue(o, &o_value.u64));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.u64, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.u64, o_value.u64);
         break;
 
     case VX_TYPE_FLOAT32:
-        VX_CALL(vxReadScalarValue(o, &o_value.f32));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.f32, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT(fabs(o_check.f32 - o_value.f32) < 0.000001f);
         break;
 
     case VX_TYPE_SIZE:
-        VX_CALL(vxReadScalarValue(o, &o_value.size));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.size, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.size, o_value.size);
         break;
 
     case VX_TYPE_BOOL:
-        VX_CALL(vxReadScalarValue(o, &o_value.boolean));
+        VX_CALL(vxCopyScalar(o, (void *)&o_value.boolean, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_EQ_INT(o_check.boolean, o_value.boolean);
         break;
 
@@ -560,3 +562,5 @@
 }
 
 TESTCASE_TESTS(ControlFlow, testSelectNode, testScalarOperationNode)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_convertcolor.c b/test_conformance/test_convertcolor.c
index d647aa4..1e7a219 100644
--- a/test_conformance/test_convertcolor.c
+++ b/test_conformance/test_convertcolor.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -572,3 +574,5 @@
 }
 
 TESTCASE_TESTS(ColorConvert, testOnRandomAndNatural)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_convertdepth.c b/test_conformance/test_convertdepth.c
index 6454b7d..7d180de 100644
--- a/test_conformance/test_convertdepth.c
+++ b/test_conformance/test_convertdepth.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
@@ -33,18 +35,60 @@
     ASSERT(src && dst);
     ASSERT(src->width == dst->width);
     ASSERT(src->height == dst->height);
-    ASSERT((src->format == VX_DF_IMAGE_U8 && dst->format == VX_DF_IMAGE_S16) || (src->format == VX_DF_IMAGE_S16 && dst->format == VX_DF_IMAGE_U8));
+    ASSERT((src->format == VX_DF_IMAGE_U1  && dst->format == VX_DF_IMAGE_U8)  ||
+           (src->format == VX_DF_IMAGE_U1  && dst->format == VX_DF_IMAGE_S16) ||
+           (src->format == VX_DF_IMAGE_U8  && dst->format == VX_DF_IMAGE_U1)  ||
+           (src->format == VX_DF_IMAGE_U8  && dst->format == VX_DF_IMAGE_S16) ||
+           (src->format == VX_DF_IMAGE_S16 && dst->format == VX_DF_IMAGE_U1)  ||
+           (src->format == VX_DF_IMAGE_S16 && dst->format == VX_DF_IMAGE_U8));
     ASSERT(policy == VX_CONVERT_POLICY_WRAP || policy == VX_CONVERT_POLICY_SATURATE);
 
     if (shift > 16) shift = 16;
     if (shift < -16) shift = -16;
 
-    if (src->format == VX_DF_IMAGE_U8)
+    if (src->format == VX_DF_IMAGE_U1)
     {
-        // according to spec the policy is ignored
-        // if (policy == VX_CONVERT_POLICY_WRAP)
+        // Up-convert policy from U1 doesn't take policy and shift into account
+        if (dst->format == VX_DF_IMAGE_U8)
         {
-            // up-conversion + wrap
+            for (i = 0; i < dst->height; ++i)
+                for (j = 0; j < dst->width; ++j)
+                    {
+                        uint32_t xShftd = j + src->roi.x % 8;    // U1 ROI offset
+                        uint8_t  pixel  = (src->data.y[i * ct_stride_bytes(src) + xShftd / 8] & (1 << (xShftd % 8))
+                                          ) != 0 ? 255 : 0;
+                        dst->data.y[i * dst->stride + j] = pixel;
+                    }
+        }
+        else    // dst->format == VX_DF_IMAGE_S16
+        {
+            for (i = 0; i < dst->height; ++i)
+                for (j = 0; j < dst->width; ++j)
+                    {
+                        uint32_t xShftd = j + src->roi.x % 8;    // U1 ROI offset
+                        int16_t  pixel  = (src->data.y[i * ct_stride_bytes(src) + xShftd / 8] & (1 << (xShftd % 8))
+                                          ) != 0 ? -1 : 0;
+                        dst->data.s16[i * dst->stride + j] = pixel;
+                    }
+        }
+    }
+    else if (src->format == VX_DF_IMAGE_U8)
+    {
+        if (dst->format == VX_DF_IMAGE_U1)
+        {
+            // Down-convert policy to U1 doesn't take policy and shift into account
+            for (i = 0; i < dst->height; ++i)
+                for (j = 0; j < dst->width; ++j)
+                {
+                    uint32_t xShftd = j + src->roi.x % 8;        // U1 ROI offset
+                    uint8_t  pixel  = (src->data.y[i * src->stride + j] != 0) ? 1 << (xShftd % 8) : 0;
+                    dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                        (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~(1 << (xShftd % 8))) | pixel;
+                }
+        }
+        else    // dst->format == VX_DF_IMAGE_S16
+        {
+            // Up-converting U8 to S16 doesn't take policy into account
             if (shift < 0)
             {
                 for (i = 0; i < dst->height; ++i)
@@ -58,30 +102,24 @@
                         dst->data.s16[i * dst->stride + j] = ((unsigned)src->data.y[i * src->stride + j]) << shift;
             }
         }
-        // else if (VX_CONVERT_POLICY_SATURATE)
-        // {
-        //     // up-conversion + saturate
-        //     if (shift < 0)
-        //     {
-        //         for (i = 0; i < dst->height; ++i)
-        //             for (j = 0; j < dst->width; ++j)
-        //                 dst->data.s16[i * dst->stride + j] = ((unsigned)src->data.y[i * src->stride + j]) >> (-shift);
-        //     }
-        //     else
-        //     {
-        //         for (i = 0; i < dst->height; ++i)
-        //             for (j = 0; j < dst->width; ++j)
-        //             {
-        //                 unsigned v = ((unsigned)src->data.y[i * src->stride + j]) << shift;
-        //                 if (v > 32767) v = 32767;
-        //                 dst->data.s16[i * dst->stride + j] = v;
-        //             }
-        //     }
-        // }
     }
+    // src->format == VX_DF_IMAGE_S16
+    else if (dst->format == VX_DF_IMAGE_U1)
+    {
+        // Down-convert policy to U1 doesn't take policy and shift into account
+        for (i = 0; i < dst->height; ++i)
+            for (j = 0; j < dst->width; ++j)
+            {
+                uint32_t xShftd = j + src->roi.x % 8;            // U1 ROI offset
+                uint8_t  pixel  = src->data.s16[i * src->stride + j] != 0 ? 1 << (xShftd % 8) : 0;
+                dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                    (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~(1 << (xShftd % 8))) | pixel;
+            }
+    }
+    // dst->format == VX_DF_IMAGE_U8
     else if (policy == VX_CONVERT_POLICY_WRAP)
     {
-        // down-conversion + wrap
+        // Down-conversion (S16 to U8) + wrap
         if (shift < 0)
         {
             for (i = 0; i < dst->height; ++i)
@@ -95,9 +133,9 @@
                     dst->data.y[i * dst->stride + j] = src->data.s16[i * src->stride + j] >> shift;
         }
     }
-    else if (policy == VX_CONVERT_POLICY_SATURATE)
+    else // policy == VX_CONVERT_POLICY_SATURATE
     {
-        // down-conversion + saturate
+        // Down-conversion (S16 to U8) + saturate
         if (shift < 0)
         {
             for (i = 0; i < dst->height; ++i)
@@ -123,15 +161,26 @@
     }
 }
 
-static void fillSquence(CT_Image dst, uint32_t seq_init)
+static void fillSequence(CT_Image dst, uint32_t seq_init)
 {
     uint32_t i, j;
     uint32_t val = seq_init;
 
     ASSERT(dst);
-    ASSERT(dst->format == VX_DF_IMAGE_U8 || dst->format == VX_DF_IMAGE_S16);
+    ASSERT(dst->format == VX_DF_IMAGE_U1 || dst->format == VX_DF_IMAGE_U8 || dst->format == VX_DF_IMAGE_S16);
 
-    if (dst->format == VX_DF_IMAGE_U8)
+    if (dst->format == VX_DF_IMAGE_U1)
+    {
+        for (i = 0; i < dst->height; ++i)
+            for (j = 0; j < dst->width; ++j)
+            {
+                uint32_t xShftd = j + dst->roi.x % 8;            // U1 ROI offset
+                uint8_t  pixel  = (++val % 2) << (xShftd % 8);
+                dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                    (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~(1 << (xShftd % 8))) | pixel;
+            }
+    }
+    else if (dst->format == VX_DF_IMAGE_U8)
     {
         for (i = 0; i < dst->height; ++i)
             for (j = 0; j < dst->width; ++j)
@@ -148,41 +197,87 @@
 TESTCASE(vxuConvertDepth, CT_VXContext, ct_setup_vx_context, 0)
 TESTCASE(vxConvertDepth,  CT_VXContext, ct_setup_vx_context, 0)
 
-
 TEST(vxuConvertDepth, NegativeSizes)
 {
-    vx_image img16x88, img88x16, img16x16;
+    vx_image img88x88, img88x40, img40x40;
     vx_int32 shift_zero = 0;
     vx_int32 shift_one = 1;
     vx_context context = context_->vx_context_;
 
-    ASSERT_VX_OBJECT(img16x88 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
-    ASSERT_VX_OBJECT(img88x16 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
-    ASSERT_VX_OBJECT(img16x16 = vxCreateImage(context, 16, 16, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img88x88 = vxCreateImage(context, 88, 88, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img88x40 = vxCreateImage(context, 88, 40, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img40x40 = vxCreateImage(context, 40, 40, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
 
     // initialize to guarantee that images are allocated
-    ASSERT_NO_FAILURE(ct_fill_image_random(img16x88, &CT()->seed_));
-    ASSERT_NO_FAILURE(ct_fill_image_random(img88x16, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(img88x88, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(img88x40, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(img40x40, &CT()->seed_));
+
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_SATURATE, shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_WRAP,     shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_SATURATE, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_WRAP,     shift_one));
+
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_SATURATE, shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_WRAP,     shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_SATURATE, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_WRAP,     shift_one));
+
+    VX_CALL(vxReleaseImage(&img88x88));
+    VX_CALL(vxReleaseImage(&img88x40));
+    VX_CALL(vxReleaseImage(&img40x40));
+}
+
+TEST(vxuConvertDepth, NegativeSizes_U1_)
+{
+    vx_image img88x88, img88x40, img40x40, img16x40, img16x16;
+    vx_int32 shift_zero = 0;
+    vx_int32 shift_one = 1;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(img88x88 = vxCreateImage(context, 88, 88, VX_DF_IMAGE_U1),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img88x40 = vxCreateImage(context, 88, 40, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img40x40 = vxCreateImage(context, 40, 40, VX_DF_IMAGE_U1),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img16x40 = vxCreateImage(context, 16, 40, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img16x16 = vxCreateImage(context, 16, 16, VX_DF_IMAGE_U1),  VX_TYPE_IMAGE);
+
+    // initialize to guarantee that images are allocated
+    ASSERT_NO_FAILURE(ct_fill_image_random(img88x88, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(img88x40, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(img40x40, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(img16x40, &CT()->seed_));
     ASSERT_NO_FAILURE(ct_fill_image_random(img16x16, &CT()->seed_));
 
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x88, img88x16, VX_CONVERT_POLICY_SATURATE, shift_zero));
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x88, img88x16, VX_CONVERT_POLICY_WRAP, shift_zero));
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x88, img88x16, VX_CONVERT_POLICY_SATURATE, shift_one));
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x88, img88x16, VX_CONVERT_POLICY_WRAP, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_SATURATE, shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_WRAP,     shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_SATURATE, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x88, img88x40, VX_CONVERT_POLICY_WRAP,     shift_one));
 
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x16, img16x16, VX_CONVERT_POLICY_SATURATE, shift_zero));
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x16, img16x16, VX_CONVERT_POLICY_WRAP, shift_zero));
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x16, img16x16, VX_CONVERT_POLICY_SATURATE, shift_one));
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x16, img16x16, VX_CONVERT_POLICY_WRAP, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_SATURATE, shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_WRAP,     shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_SATURATE, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img88x40, img40x40, VX_CONVERT_POLICY_WRAP,     shift_one));
 
-    VX_CALL(vxReleaseImage(&img16x88));
-    VX_CALL(vxReleaseImage(&img88x16));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img40x40, img16x40, VX_CONVERT_POLICY_SATURATE, shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img40x40, img16x40, VX_CONVERT_POLICY_WRAP,     shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img40x40, img16x40, VX_CONVERT_POLICY_SATURATE, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img40x40, img16x40, VX_CONVERT_POLICY_WRAP,     shift_one));
+
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x40, img16x16, VX_CONVERT_POLICY_SATURATE, shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x40, img16x16, VX_CONVERT_POLICY_WRAP,     shift_zero));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x40, img16x16, VX_CONVERT_POLICY_SATURATE, shift_one));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, img16x40, img16x16, VX_CONVERT_POLICY_WRAP,     shift_one));
+
+    VX_CALL(vxReleaseImage(&img88x88));
+    VX_CALL(vxReleaseImage(&img88x40));
+    VX_CALL(vxReleaseImage(&img40x40));
+    VX_CALL(vxReleaseImage(&img16x40));
     VX_CALL(vxReleaseImage(&img16x16));
 }
 
 TEST(vxConvertDepth, NegativeSizes)
 {
-    vx_image img16x88, img88x16, img16x16;
+    vx_image img88x88, img88x40, img40x40;
     vx_graph graph;
     vx_node node;
     vx_scalar shift;
@@ -190,36 +285,108 @@
     vx_context context = context_->vx_context_;
 
     ASSERT_VX_OBJECT(shift = vxCreateScalar(context, VX_TYPE_INT32, &sh), VX_TYPE_SCALAR);
-    ASSERT_VX_OBJECT(img16x88 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
-    ASSERT_VX_OBJECT(img88x16 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
-    ASSERT_VX_OBJECT(img16x16 = vxCreateImage(context, 16, 16, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img88x88 = vxCreateImage(context, 88, 88, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img88x40 = vxCreateImage(context, 88, 40, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img40x40 = vxCreateImage(context, 40, 40, VX_DF_IMAGE_U8),  VX_TYPE_IMAGE);
 
+    /* U8 -> S16 */
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img16x88, img88x16, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x88, img88x40, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x88, img88x40, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
     EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
     VX_CALL(vxReleaseNode(&node));
     VX_CALL(vxReleaseGraph(&graph));
 
+    /* S16 -> U8 */
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img16x88, img88x16, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x40, img40x40, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x40, img40x40, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
     EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
     VX_CALL(vxReleaseNode(&node));
     VX_CALL(vxReleaseGraph(&graph));
 
+    VX_CALL(vxReleaseImage(&img88x88));
+    VX_CALL(vxReleaseImage(&img88x40));
+    VX_CALL(vxReleaseImage(&img40x40));
+    VX_CALL(vxReleaseScalar(&shift));
+}
+
+TEST(vxConvertDepth, NegativeSizes_U1_)
+{
+    vx_image img88x88, img88x40, img40x40, img16x40, img16x16;
+    vx_graph graph;
+    vx_node node;
+    vx_scalar shift;
+    vx_int32 sh = 1;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(shift = vxCreateScalar(context, VX_TYPE_INT32, &sh), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(img88x88 = vxCreateImage(context, 88, 88, VX_DF_IMAGE_U1),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img88x40 = vxCreateImage(context, 88, 40, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img40x40 = vxCreateImage(context, 40, 40, VX_DF_IMAGE_U1),  VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img16x40 = vxCreateImage(context, 16, 40, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(img16x16 = vxCreateImage(context, 16, 16, VX_DF_IMAGE_U1),  VX_TYPE_IMAGE);
+
+    /* U1 -> U8 */
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x16, img16x16, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x88, img88x40, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x88, img88x40, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
     EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
     VX_CALL(vxReleaseNode(&node));
     VX_CALL(vxReleaseGraph(&graph));
 
+    /* U8 -> U1 */
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x16, img16x16, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x40, img40x40, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img88x40, img40x40, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
     EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
     VX_CALL(vxReleaseNode(&node));
     VX_CALL(vxReleaseGraph(&graph));
 
-    VX_CALL(vxReleaseImage(&img16x88));
-    VX_CALL(vxReleaseImage(&img88x16));
+    /* U1 -> S16 */
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img40x40, img16x40, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img40x40, img16x40, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    /* S16 -> U1 */
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img16x40, img16x16, VX_CONVERT_POLICY_SATURATE, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, img16x40, img16x16, VX_CONVERT_POLICY_WRAP, shift), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    VX_CALL(vxReleaseImage(&img88x88));
+    VX_CALL(vxReleaseImage(&img88x40));
+    VX_CALL(vxReleaseImage(&img40x40));
+    VX_CALL(vxReleaseImage(&img16x40));
     VX_CALL(vxReleaseImage(&img16x16));
     VX_CALL(vxReleaseScalar(&shift));
 }
@@ -233,7 +400,10 @@
     vx_enum policy;
 } cvt_depth_arg;
 
-#define CVT_ARG(w,h,from,to,p) ARG(#p"/"#w"x"#h" "#from"->"#to, w, h, VX_DF_IMAGE_##from, VX_DF_IMAGE_##to, VX_CONVERT_POLICY_##p)
+#define CVT_ARG(w,h,from,to,p)    \
+    ARG(        #p "/" #w "x" #h " " #from "->" #to, w, h, VX_DF_IMAGE_##from, VX_DF_IMAGE_##to, VX_CONVERT_POLICY_##p)
+#define CVT_ARG_U1(w,h,from,to,p) \
+    ARG("_U1_/" #p "/" #w "x" #h " " #from "->" #to, w, h, VX_DF_IMAGE_##from, VX_DF_IMAGE_##to, VX_CONVERT_POLICY_##p)
 
 #define PREPEND_SIZE(macro, ...)                \
     CT_EXPAND(macro(1, 1, __VA_ARGS__)),        \
@@ -246,40 +416,48 @@
     CT_EXPAND(macro(1280, 720, __VA_ARGS__)),
     CT_EXPAND(macro(1920, 1080, __VA_ARGS__))*/
 
-#define CVT_ARGS                                \
-    PREPEND_SIZE(CVT_ARG, U8, S16, SATURATE),   \
-    PREPEND_SIZE(CVT_ARG, U8, S16, WRAP),       \
-    PREPEND_SIZE(CVT_ARG, S16, U8, SATURATE),   \
-    PREPEND_SIZE(CVT_ARG, S16, U8, WRAP)
+#define CVT_ARGS                                    \
+    PREPEND_SIZE(CVT_ARG,     U8, S16, SATURATE),   \
+    PREPEND_SIZE(CVT_ARG,     U8, S16, WRAP),       \
+    PREPEND_SIZE(CVT_ARG,    S16,  U8, SATURATE),   \
+    PREPEND_SIZE(CVT_ARG,    S16,  U8, WRAP),       \
+    PREPEND_SIZE(CVT_ARG_U1,  U1,  U8, SATURATE),   \
+    PREPEND_SIZE(CVT_ARG_U1,  U1,  U8, WRAP),       \
+    PREPEND_SIZE(CVT_ARG_U1,  U8,  U1, SATURATE),   \
+    PREPEND_SIZE(CVT_ARG_U1,  U8,  U1, WRAP),       \
+    PREPEND_SIZE(CVT_ARG_U1,  U1, S16, SATURATE),   \
+    PREPEND_SIZE(CVT_ARG_U1,  U1, S16, WRAP),       \
+    PREPEND_SIZE(CVT_ARG_U1, S16,  U1, SATURATE),   \
+    PREPEND_SIZE(CVT_ARG_U1, S16,  U1, WRAP)
 
 TEST_WITH_ARG(vxuConvertDepth, BitExact, cvt_depth_arg, CVT_ARGS)
 {
     vx_image src, dst;
-    CT_Image ref_src, refdst, vxdst;
+    CT_Image ref_src, ref_dst, vx_dst;
     vx_int32 shift_val;
     vx_context context = context_->vx_context_;
 
     ASSERT_NO_FAILURE({
         ref_src = ct_allocate_image(arg_->width, arg_->height, arg_->format_from);
-        fillSquence(ref_src, (uint32_t)CT()->seed_);
+        fillSequence(ref_src, (uint32_t)CT()->seed_);
         src = ct_image_to_vx_image(ref_src, context);
     });
 
     ASSERT_VX_OBJECT(dst = vxCreateImage(context, arg_->width, arg_->height, arg_->format_to), VX_TYPE_IMAGE);
 
-    refdst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
-    vxdst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
+    ref_dst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
+    vx_dst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
     for (shift_val = VALID_SHIFT_MIN; shift_val <= VALID_SHIFT_MAX; ++shift_val)
     {
         ct_update_progress(shift_val - VALID_SHIFT_MIN, VALID_SHIFT_MAX - VALID_SHIFT_MIN + 1);
         EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxuConvertDepth(context, src, dst, arg_->policy, shift_val));
 
         ASSERT_NO_FAILURE({
-            ct_image_copyfrom_vx_image(vxdst, dst);
-            referenceConvertDepth(ref_src, refdst, shift_val, arg_->policy);
+            ct_image_copyfrom_vx_image(vx_dst, dst);
+            referenceConvertDepth(ref_src, ref_dst, shift_val, arg_->policy);
         });
 
-        EXPECT_EQ_CTIMAGE(refdst, vxdst);
+        EXPECT_EQ_CTIMAGE(ref_dst, vx_dst);
         if (CT_HasFailure())
         {
             printf("Shift value is %d\n", shift_val);
@@ -297,7 +475,7 @@
 TEST_WITH_ARG(vxConvertDepth, BitExact, cvt_depth_arg, CVT_ARGS)
 {
     vx_image src, dst;
-    CT_Image ref_src, refdst, vxdst;
+    CT_Image ref_src, ref_dst, vx_dst;
     vx_graph graph;
     vx_node node;
     vx_scalar scalar_shift;
@@ -307,7 +485,7 @@
 
     ASSERT_NO_FAILURE({
         ref_src = ct_allocate_image(arg_->width, arg_->height, arg_->format_from);
-        fillSquence(ref_src, (uint32_t)CT()->seed_);
+        fillSequence(ref_src, (uint32_t)CT()->seed_);
         src = ct_image_to_vx_image(ref_src, context);
     });
 
@@ -316,8 +494,8 @@
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
     ASSERT_VX_OBJECT(node = vxConvertDepthNode(graph, src, dst, arg_->policy, scalar_shift), VX_TYPE_NODE);
 
-    refdst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
-    vxdst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
+    ref_dst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
+    vx_dst = ct_allocate_image(arg_->width, arg_->height, arg_->format_to);
     for (shift = VALID_SHIFT_MIN; shift <= VALID_SHIFT_MAX; ++shift)
     {
         ct_update_progress(shift - VALID_SHIFT_MIN, VALID_SHIFT_MAX - VALID_SHIFT_MIN + 1);
@@ -332,11 +510,11 @@
 #endif
 
         ASSERT_NO_FAILURE({
-            ct_image_copyfrom_vx_image(vxdst, dst);
-            referenceConvertDepth(ref_src, refdst, shift, arg_->policy);
+            ct_image_copyfrom_vx_image(vx_dst, dst);
+            referenceConvertDepth(ref_src, ref_dst, shift, arg_->policy);
         });
 
-        EXPECT_EQ_CTIMAGE(refdst, vxdst);
+        EXPECT_EQ_CTIMAGE(ref_dst, vx_dst);
         if (CT_HasFailure())
         {
             printf("Shift value is %d\n", shift);
@@ -351,5 +529,7 @@
     VX_CALL(vxReleaseGraph(&graph));
 }
 
-TESTCASE_TESTS(vxuConvertDepth, DISABLED_NegativeSizes, BitExact)
-TESTCASE_TESTS(vxConvertDepth,  DISABLED_NegativeSizes, BitExact)
+TESTCASE_TESTS(vxuConvertDepth, DISABLED_NegativeSizes, DISABLED_NegativeSizes_U1_, BitExact)
+TESTCASE_TESTS(vxConvertDepth,  DISABLED_NegativeSizes, DISABLED_NegativeSizes_U1_, BitExact)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_convolution.c b/test_conformance/test_convolution.c
index ca347f5..5c9efbb 100644
--- a/test_conformance/test_convolution.c
+++ b/test_conformance/test_convolution.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -119,3 +121,5 @@
 }
 
 TESTCASE_TESTS(Convolution, test_vxCreateConvolution, test_vxCopyConvolution, test_vxQueryConvolution, test_vxCreateVirtualConvolution)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_convolve.c b/test_conformance/test_convolve.c
index aa2b827..4a579e2 100644
--- a/test_conformance/test_convolve.c
+++ b/test_conformance/test_convolve.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -368,3 +370,5 @@
 }
 
 TESTCASE_TESTS(Convolve, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_copy.c b/test_conformance/test_copy.c
index 79d762b..3abe952 100644
--- a/test_conformance/test_copy.c
+++ b/test_conformance/test_copy.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
@@ -92,13 +94,13 @@
             vxReleaseReference((vx_reference*)&scalar_exemplar);
             break;
         case VX_TYPE_TENSOR:
-            dims = malloc(TENSOR_DIMS_NUM * sizeof(vx_size));
+            dims = ct_alloc_mem(TENSOR_DIMS_NUM * sizeof(vx_size));
             for(vx_size i = 0; i < TENSOR_DIMS_NUM; i++)
             {
                 dims[i] = TENSOR_DIMS_LENGTH;
             }
             exemplar = (vx_reference)vxCreateTensor(context, TENSOR_DIMS_NUM, dims, obj_item_type, 0);
-            free(dims);
+            ct_free_mem(dims);
             break;
         default:
             break;
@@ -263,7 +265,7 @@
                 vx_size stride = IMAGE_SIZE_X*2;
                 vx_size stride_y = sizeof(vx_coordinates2df_t) * (stride);
                 vx_size size = stride * IMAGE_SIZE_Y*2;
-                vx_coordinates2df_t* ptr_w = malloc(sizeof(vx_coordinates2df_t) * size);
+                vx_coordinates2df_t* ptr_w = ct_alloc_mem(sizeof(vx_coordinates2df_t) * size);
 
                 for (vx_size i = 0; i < IMAGE_SIZE_Y*2; i++)
                 {
@@ -276,7 +278,7 @@
                 }
 
                 VX_CALL(vxCopyRemapPatch(input_remap, &rect, stride_y, ptr_w, VX_TYPE_COORDINATES2DF, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
-                free(ptr_w);
+                ct_free_mem(ptr_w);
                 break;
             }
         case VX_TYPE_THRESHOLD:
@@ -292,7 +294,7 @@
                 vx_tensor input_tensor = (vx_tensor)input;
                 vx_size start[TENSOR_DIMS_NUM] = { 0 };
                 vx_size strides[TENSOR_DIMS_NUM]= { 0 };
-                vx_size * dims = malloc(TENSOR_DIMS_NUM * sizeof(vx_size));
+                vx_size * dims = ct_alloc_mem(TENSOR_DIMS_NUM * sizeof(vx_size));
                 for(vx_size i = 0; i < TENSOR_DIMS_NUM; i++)
                 {
                     dims[i] = TENSOR_DIMS_LENGTH;
@@ -300,7 +302,7 @@
                     strides[i] = i ? strides[i - 1] * dims[i - 1] : sizeof(vx_uint8);
                 }
                 const vx_size bytes = dims[TENSOR_DIMS_NUM - 1] * strides[TENSOR_DIMS_NUM - 1];
-                void * data = malloc(bytes);
+                void * data = ct_alloc_mem(bytes);
                 vx_uint8* u8_data = (vx_uint8*)data;
                 for(vx_size i = 0; i < bytes; i++)
                 {
@@ -308,8 +310,8 @@
                 }
 
                 VX_CALL(vxCopyTensorPatch(input_tensor, TENSOR_DIMS_NUM, start, dims, strides, data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
-                free(dims);
-                free(data);
+                ct_free_mem(dims);
+                ct_free_mem(data);
                 break;
             }
         default:
@@ -484,7 +486,7 @@
                 vx_tensor output_tensor = (vx_tensor)output;
                 vx_size start[TENSOR_DIMS_NUM] = { 0 };
                 vx_size strides[TENSOR_DIMS_NUM]= { 0 };
-                vx_size * dims = malloc(TENSOR_DIMS_NUM * sizeof(vx_size));
+                vx_size * dims = ct_alloc_mem(TENSOR_DIMS_NUM * sizeof(vx_size));
                 for(vx_size i = 0; i < TENSOR_DIMS_NUM; i++)
                 {
                     dims[i] = TENSOR_DIMS_LENGTH;
@@ -492,15 +494,15 @@
                     strides[i] = i ? strides[i - 1] * dims[i - 1] : sizeof(vx_uint8);
                 }
                 const vx_size bytes = dims[TENSOR_DIMS_NUM - 1] * strides[TENSOR_DIMS_NUM - 1];
-                void * data = malloc(bytes);
+                void * data = ct_alloc_mem(bytes);
                 VX_CALL(vxCopyTensorPatch(output_tensor, TENSOR_DIMS_NUM, start, dims, strides, data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
                 vx_uint8* u8_data = (vx_uint8*)data;
                 for(vx_size i = 0; i < bytes; i++)
                 {
                     ASSERT(u8_data[i] == 2);
                 }
-                free(dims);
-                free(data);
+                ct_free_mem(dims);
+                ct_free_mem(data);
                 break;
             }
         default:
@@ -640,7 +642,7 @@
                 vx_size stride = IMAGE_SIZE_X*2;
                 vx_size stride_y = sizeof(vx_coordinates2df_t) * (stride);
                 vx_size size = stride * IMAGE_SIZE_Y*2;
-                vx_coordinates2df_t* ptr_w = malloc(sizeof(vx_coordinates2df_t) * size);
+                vx_coordinates2df_t* ptr_w = ct_alloc_mem(sizeof(vx_coordinates2df_t) * size);
 
                 for (vx_size i = 0; i < IMAGE_SIZE_Y*2; i++)
                 {
@@ -653,7 +655,7 @@
                 }
 
                 VX_CALL(vxCopyRemapPatch(input_remap, &rect, stride_y, ptr_w, VX_TYPE_COORDINATES2DF, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
-                free(ptr_w);
+                ct_free_mem(ptr_w);
                 break;
             }
         case VX_TYPE_TENSOR:
@@ -661,7 +663,7 @@
                 vx_tensor input_tensor = (vx_tensor)input;
                 vx_size start[TENSOR_DIMS_NUM] = { 0 };
                 vx_size strides[TENSOR_DIMS_NUM]= { 0 };
-                vx_size * dims = malloc(TENSOR_DIMS_NUM * sizeof(vx_size));
+                vx_size * dims = ct_alloc_mem(TENSOR_DIMS_NUM * sizeof(vx_size));
                 for(vx_size i = 0; i < TENSOR_DIMS_NUM; i++)
                 {
                     dims[i] = TENSOR_DIMS_LENGTH;
@@ -669,7 +671,7 @@
                     strides[i] = i ? strides[i - 1] * dims[i - 1] : sizeof(vx_uint8);
                 }
                 const vx_size bytes = dims[TENSOR_DIMS_NUM - 1] * strides[TENSOR_DIMS_NUM - 1];
-                void * data = malloc(bytes);
+                void * data = ct_alloc_mem(bytes);
                 vx_uint8* u8_data = (vx_uint8*)data;
                 for(vx_size i = 0; i < bytes; i++)
                 {
@@ -677,8 +679,8 @@
                 }
 
                 VX_CALL(vxCopyTensorPatch(input_tensor, TENSOR_DIMS_NUM, start, dims, strides, data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
-                free(dims);
-                free(data);
+                ct_free_mem(dims);
+                ct_free_mem(data);
                 break;
             }
         default:
@@ -693,7 +695,6 @@
         case VX_TYPE_IMAGE:
             {
             vx_image output_image = (vx_image)output;
-            int i;
             void *p = NULL;
             vx_map_id output_map_id;
             vx_rectangle_t rect;
@@ -849,7 +850,7 @@
                 vx_tensor output_tensor = (vx_tensor)output;
                 vx_size start[TENSOR_DIMS_NUM] = { 0 };
                 vx_size strides[TENSOR_DIMS_NUM]= { 0 };
-                vx_size * dims = malloc(TENSOR_DIMS_NUM * sizeof(vx_size));
+                vx_size * dims = ct_alloc_mem(TENSOR_DIMS_NUM * sizeof(vx_size));
                 for(vx_size i = 0; i < TENSOR_DIMS_NUM; i++)
                 {
                     dims[i] = TENSOR_DIMS_LENGTH;
@@ -857,15 +858,15 @@
                     strides[i] = i ? strides[i - 1] * dims[i - 1] : sizeof(vx_uint8);
                 }
                 const vx_size bytes = dims[TENSOR_DIMS_NUM - 1] * strides[TENSOR_DIMS_NUM - 1];
-                void * data = malloc(bytes);
+                void * data = ct_alloc_mem(bytes);
                 VX_CALL(vxCopyTensorPatch(output_tensor, TENSOR_DIMS_NUM, start, dims, strides, data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
                 vx_uint8* u8_data = (vx_uint8*)data;
                 for(vx_size i = 0; i < bytes; i++)
                 {
                     ASSERT(u8_data[i] == 2);
                 }
-                free(dims);
-                free(data);
+                ct_free_mem(dims);
+                ct_free_mem(data);
                 break;
             }
         default:
@@ -882,13 +883,4 @@
     testImmediateProcessing
 )
 
-
-
-
-
-
-
-
-
-
-
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_dilate3x3.c b/test_conformance/test_dilate3x3.c
index 0f16ff2..6fd1aa5 100644
--- a/test_conformance/test_dilate3x3.c
+++ b/test_conformance/test_dilate3x3.c
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
-
 TESTCASE(Dilate3x3, CT_VXContext, ct_setup_vx_context, 0)
 
-
 TEST(Dilate3x3, testNodeCreation)
 {
     vx_context context = context_->vx_context_;
@@ -49,33 +49,62 @@
     ASSERT(src_image == 0);
 }
 
-
-// VX_DF_IMAGE_8U Boolean image
-static CT_Image dilate3x3_generate_random(const char* fileName, int width, int height)
+static CT_Image dilate3x3_generate_random(const char* fileName, int width, int height, vx_df_image format)
 {
     CT_Image image;
 
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 2));
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
 
-    // convert 0/1 values to 0/255
-    CT_FILL_IMAGE_8U(return 0, image,
-            *dst_data = (*dst_data) ? 255 : 0);
+    ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 2));
+
+    if (format == VX_DF_IMAGE_U8)
+    {
+        // convert 0/1 values to 0/255
+        CT_FILL_IMAGE_8U(return 0, image, *dst_data = (*dst_data) ? 255 : 0);
+    }
 
     return image;
 }
 
-static CT_Image dilate3x3_read_image(const char* fileName, int width, int height)
+static CT_Image dilate3x3_read_image(const char* fileName, int width, int height, vx_df_image format)
 {
-    CT_Image image = NULL;
+    CT_Image image_load = NULL, image_ret = NULL;
     ASSERT_(return 0, width == 0 && height == 0);
-    image = ct_read_image(fileName, 1);
-    ASSERT_(return 0, image);
-    ASSERT_(return 0, image->format == VX_DF_IMAGE_U8);
-    return image;
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    image_load = ct_read_image(fileName, 1);
+    ASSERT_(return 0, image_load);
+    ASSERT_(return 0, image_load->format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+    {
+        ASSERT_NO_FAILURE_(return 0, threshold_U8_ct_image(image_load, 127));   // Threshold to make the U1 image less trivial
+        ASSERT_NO_FAILURE_(return 0, image_ret = ct_allocate_image(image_load->width, image_load->height, VX_DF_IMAGE_U1));
+        ASSERT_NO_FAILURE_(return 0, U8_ct_image_to_U1_ct_image(image_load, image_ret));
+    }
+    else
+        image_ret = image_load;
+
+    ASSERT_(return 0, image_ret);
+    ASSERT_(return 0, image_ret->format == format);
+
+    return image_ret;
 }
 
-static int32_t dilate_get(int32_t *values)
+static int32_t dilate_get_U1(int32_t values[9][2])
+{
+    int i;
+    int32_t v_i;
+    int32_t v = (values[0][0] & (1 << (values[0][1] % 8))) >> (values[0][1] % 8);
+    for (i = 1; i < 9; i++)
+    {
+        v_i = (values[i][0] & (1 << (values[i][1] % 8))) >> (values[i][1] % 8);
+        v = (v < v_i) ? v_i : v;
+    }
+    return v;
+}
+
+static int32_t dilate_get_U8(int32_t *values)
 {
     int i;
     int32_t v = values[0];
@@ -86,54 +115,109 @@
 
 static uint8_t dilate3x3_calculate(CT_Image src, uint32_t x, uint32_t y)
 {
-    int32_t values[9] = {
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 1)
-    };
-    return (uint8_t)dilate_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        int32_t values[9][2] = {
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y + 0), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y + 0), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y + 0), (int32_t)x + 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y - 1), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y - 1), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y - 1), (int32_t)x + 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y + 1), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y + 1), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y + 1), (int32_t)x + 1}
+        };
+        return (uint8_t)dilate_get_U1(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 1)
+        };
+        return (uint8_t)dilate_get_U8(values);
+    }
 }
 
 static uint8_t dilate3x3_calculate_replicate(CT_Image src, uint32_t x_, uint32_t y_)
 {
     int32_t x = (int)x_;
     int32_t y = (int)y_;
-    int32_t values[9] = {
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 1)
-    };
-    return (uint8_t)dilate_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y + 1)
+        };
+        return (uint8_t)dilate_get_U8(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 1)
+        };
+        return (uint8_t)dilate_get_U8(values);
+    }
 }
 
 static uint8_t dilate3x3_calculate_constant(CT_Image src, uint32_t x_, uint32_t y_, vx_uint32 constant_value)
 {
     int32_t x = (int)x_;
     int32_t y = (int)y_;
-    int32_t values[9] = {
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 1, constant_value)
-    };
-    return (uint8_t)dilate_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        vx_bool const_val_bool = (constant_value == 0) ? vx_false_e : vx_true_e;
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y + 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y + 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y + 1, const_val_bool)
+        };
+        return (uint8_t)dilate_get_U8(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 1, constant_value)
+        };
+        return (uint8_t)dilate_get_U8(values);
+    }
 }
 
 
@@ -141,35 +225,72 @@
 {
     CT_Image dst;
 
-    CT_ASSERT_(return NULL, src->format == VX_DF_IMAGE_U8);
+    CT_ASSERT_(return NULL, src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8);
 
     dst = ct_allocate_image(src->width, src->height, src->format);
 
     if (border.mode == VX_BORDER_UNDEFINED)
     {
-        CT_FILL_IMAGE_8U(return 0, dst,
-                if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
-                {
-                    uint8_t res = dilate3x3_calculate(src, x, y);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
+                    {
+                        uint32_t xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = dilate3x3_calculate(src, xShftdSrc, y);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
+                    {
+                        uint8_t res = dilate3x3_calculate(src, x, y);
+                        *dst_data = res;
+                    });
+        }
     }
     else if (border.mode == VX_BORDER_REPLICATE)
     {
-        CT_FILL_IMAGE_8U(return 0, dst,
-                {
-                    uint8_t res = dilate3x3_calculate_replicate(src, x, y);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    {
+                        uint32_t xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = dilate3x3_calculate_replicate(src, xShftdSrc, y);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    {
+                        uint8_t res = dilate3x3_calculate_replicate(src, x, y);
+                        *dst_data = res;
+                    });
+        }
     }
     else if (border.mode == VX_BORDER_CONSTANT)
     {
         vx_uint32 constant_value = border.constant_value.U32;
-        CT_FILL_IMAGE_8U(return 0, dst,
-                {
-                    uint8_t res = dilate3x3_calculate_constant(src, x, y, constant_value);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    {
+                        uint32_t xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = dilate3x3_calculate_constant(src, xShftdSrc, y, constant_value);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    {
+                        uint8_t res = dilate3x3_calculate_constant(src, x, y, constant_value);
+                        *dst_data = res;
+                    });
+        }
     }
     else
     {
@@ -211,15 +332,18 @@
 
 typedef struct {
     const char* testName;
-    CT_Image (*generator)(const char* fileName, int width, int height);
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     vx_border_t border;
     int width, height;
+    vx_df_image format;
 } Arg;
 
 #define PARAMETERS \
-    CT_GENERATE_PARAMETERS("randomInput", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ARG, dilate3x3_generate_random, NULL), \
-    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ARG, dilate3x3_read_image, "lena.bmp")
+    CT_GENERATE_PARAMETERS("randomInput", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ARG, dilate3x3_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U8, ARG, dilate3x3_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/randomInput", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ARG, dilate3x3_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U1, ARG, dilate3x3_read_image, "lena.bmp")
 
 TEST_WITH_ARG(Dilate3x3, testGraphProcessing, Arg,
     PARAMETERS
@@ -233,7 +357,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -275,7 +399,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -296,4 +420,57 @@
     ASSERT(src_image == 0);
 }
 
-TESTCASE_TESTS(Dilate3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+typedef struct {
+    const char* testName;
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    vx_border_t border;
+    int width, height;
+    vx_df_image format;
+    vx_rectangle_t regionShift;
+} ValidRegionTest_Arg;
+
+#define REGION_PARAMETERS \
+    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VALID_REGION_SHRINKS, ARG, dilate3x3_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VALID_REGION_SHRINKS, ARG, dilate3x3_read_image, "lena.bmp")
+
+TEST_WITH_ARG(Dilate3x3, testWithValidRegion, ValidRegionTest_Arg,
+    REGION_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, dst_image = 0;
+
+    CT_Image src = NULL, dst = NULL;
+    vx_border_t border = arg_->border;
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->regionShift;
+
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+
+    ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = ct_create_similar_image(src_image), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(src_image, &rect));
+    ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(src_image, &rect));
+
+    VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
+
+    VX_CALL(vxuDilate3x3(context, src_image, dst_image));
+
+    ASSERT_NO_FAILURE(dst = ct_image_from_vx_image(dst_image));
+    ASSERT_NO_FAILURE(ct_adjust_roi(dst, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+
+    ASSERT_NO_FAILURE(ct_adjust_roi(src, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+    ASSERT_NO_FAILURE(dilate3x3_check(src, dst, border));
+
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TESTCASE_TESTS(Dilate3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing, testWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_distribution.c b/test_conformance/test_distribution.c
index dad1c33..2742a77 100644
--- a/test_conformance/test_distribution.c
+++ b/test_conformance/test_distribution.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <string.h>
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -73,7 +75,7 @@
             CT_FAIL("check for query distribution attribute VX_DISTRIBUTION_BINS failed\n");
 
         VX_CALL(vxQueryDistribution(dist1, VX_DISTRIBUTION_WINDOW, &attr_window, sizeof(attr_window)));
-        /*Tthe attribute is specified as valid only when the range is a multiple of nbins, 
+        /*Tthe attribute is specified as valid only when the range is a multiple of nbins,
         * in other cases, its value shouldn't be checked */
         if (((range % nbins) == 0) && (attr_window != reference_window(range, nbins)))
             CT_FAIL("check for query distribution attribute VX_DISTRIBUTION_WINDOW failed\n");
@@ -85,3 +87,5 @@
 }
 
 TESTCASE_TESTS(Distribution, testvxCreateVirtualDistribution)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_eqhist.c b/test_conformance/test_eqhist.c
index 3724072..4612d0b 100644
--- a/test_conformance/test_eqhist.c
+++ b/test_conformance/test_eqhist.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -175,3 +177,6 @@
 }
 
 TESTCASE_TESTS(EqualizeHistogram, testOnRandom)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
diff --git a/test_conformance/test_erode3x3.c b/test_conformance/test_erode3x3.c
index 1468e82..999429a 100644
--- a/test_conformance/test_erode3x3.c
+++ b/test_conformance/test_erode3x3.c
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
-
 TESTCASE(Erode3x3, CT_VXContext, ct_setup_vx_context, 0)
 
-
 TEST(Erode3x3, testNodeCreation)
 {
     vx_context context = context_->vx_context_;
@@ -49,33 +49,62 @@
     ASSERT(src_image == 0);
 }
 
-
-// VX_DF_IMAGE_8U Boolean image
-static CT_Image erode3x3_generate_random(const char* fileName, int width, int height)
+static CT_Image erode3x3_generate_random(const char* fileName, int width, int height, vx_df_image format)
 {
     CT_Image image;
 
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 2));
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
 
-    // convert 0/1 values to 0/255
-    CT_FILL_IMAGE_8U(return 0, image,
-            *dst_data = (*dst_data) ? 255 : 0);
+    ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 2));
+
+    if (format == VX_DF_IMAGE_U8)
+    {
+        // convert 0/1 values to 0/255
+        CT_FILL_IMAGE_8U(return 0, image, *dst_data = (*dst_data) ? 255 : 0);
+    }
 
     return image;
 }
 
-static CT_Image erode3x3_read_image(const char* fileName, int width, int height)
+static CT_Image erode3x3_read_image(const char* fileName, int width, int height, vx_df_image format)
 {
-    CT_Image image = NULL;
+    CT_Image image_load = NULL, image_ret = NULL;
     ASSERT_(return 0, width == 0 && height == 0);
-    image = ct_read_image(fileName, 1);
-    ASSERT_(return 0, image);
-    ASSERT_(return 0, image->format == VX_DF_IMAGE_U8);
-    return image;
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    image_load = ct_read_image(fileName, 1);
+    ASSERT_(return 0, image_load);
+    ASSERT_(return 0, image_load->format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+    {
+        ASSERT_NO_FAILURE_(return 0, threshold_U8_ct_image(image_load, 127));   // Threshold to make the U1 image less trivial
+        ASSERT_NO_FAILURE_(return 0, image_ret = ct_allocate_image(image_load->width, image_load->height, VX_DF_IMAGE_U1));
+        ASSERT_NO_FAILURE_(return 0, U8_ct_image_to_U1_ct_image(image_load, image_ret));
+    }
+    else
+        image_ret = image_load;
+
+    ASSERT_(return 0, image_ret);
+    ASSERT_(return 0, image_ret->format == format);
+
+    return image_ret;
 }
 
-static int32_t erode_get(int32_t *values)
+static int32_t erode_get_U1(int32_t values[9][2])
+{
+    int i;
+    int32_t v_i;
+    int32_t v = (values[0][0] & (1 << (values[0][1] % 8))) >> (values[0][1] % 8);
+    for (i = 1; i < 9; i++)
+    {
+        v_i = (values[i][0] & (1 << (values[i][1] % 8))) >> (values[i][1] % 8);
+        v = (v > v_i) ? v_i : v;
+    }
+    return v;
+}
+
+static int32_t erode_get_U8(int32_t *values)
 {
     int i;
     int32_t v = values[0];
@@ -86,54 +115,109 @@
 
 static uint8_t erode3x3_calculate(CT_Image src, uint32_t x, uint32_t y)
 {
-    int32_t values[9] = {
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 1)
-    };
-    return (uint8_t)erode_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        int32_t values[9][2] = {
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y + 0), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y + 0), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y + 0), (int32_t)x + 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y - 1), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y - 1), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y - 1), (int32_t)x + 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y + 1), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y + 1), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y + 1), (int32_t)x + 1}
+        };
+        return (uint8_t)erode_get_U1(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 1)
+        };
+        return (uint8_t)erode_get_U8(values);
+    }
 }
 
 static uint8_t erode3x3_calculate_replicate(CT_Image src, uint32_t x_, uint32_t y_)
 {
     int32_t x = (int)x_;
     int32_t y = (int)y_;
-    int32_t values[9] = {
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 1)
-    };
-    return (uint8_t)erode_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y + 1)
+        };
+        return (uint8_t)erode_get_U8(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 1)
+        };
+        return (uint8_t)erode_get_U8(values);
+    }
 }
 
 static uint8_t erode3x3_calculate_constant(CT_Image src, uint32_t x_, uint32_t y_, vx_uint32 constant_value)
 {
     int32_t x = (int)x_;
     int32_t y = (int)y_;
-    int32_t values[9] = {
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 1, constant_value)
-    };
-    return (uint8_t)erode_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        vx_bool const_val_bool = (constant_value == 0) ? vx_false_e : vx_true_e;
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y + 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y + 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y + 1, const_val_bool)
+        };
+        return (uint8_t)erode_get_U8(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 1, constant_value)
+        };
+        return (uint8_t)erode_get_U8(values);
+    }
 }
 
 
@@ -141,35 +225,72 @@
 {
     CT_Image dst;
 
-    CT_ASSERT_(return NULL, src->format == VX_DF_IMAGE_U8);
+    CT_ASSERT_(return NULL, src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8);
 
     dst = ct_allocate_image(src->width, src->height, src->format);
 
     if (border.mode == VX_BORDER_UNDEFINED)
     {
-        CT_FILL_IMAGE_8U(return 0, dst,
-                if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
-                {
-                    uint8_t res = erode3x3_calculate(src, x, y);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
+                    {
+                        vx_uint32 xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = erode3x3_calculate(src, xShftdSrc, y);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
+                    {
+                        uint8_t res = erode3x3_calculate(src, x, y);
+                        *dst_data = res;
+                    });
+        }
     }
     else if (border.mode == VX_BORDER_REPLICATE)
     {
-        CT_FILL_IMAGE_8U(return 0, dst,
-                {
-                    uint8_t res = erode3x3_calculate_replicate(src, x, y);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    {
+                        vx_uint32 xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = erode3x3_calculate_replicate(src, xShftdSrc, y);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    {
+                        uint8_t res = erode3x3_calculate_replicate(src, x, y);
+                        *dst_data = res;
+                    });
+        }
     }
     else if (border.mode == VX_BORDER_CONSTANT)
     {
         vx_uint32 constant_value = border.constant_value.U32;
-        CT_FILL_IMAGE_8U(return 0, dst,
-                {
-                    uint8_t res = erode3x3_calculate_constant(src, x, y, constant_value);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    {
+                        vx_uint32 xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = erode3x3_calculate_constant(src, xShftdSrc, y, constant_value);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    {
+                        uint8_t res = erode3x3_calculate_constant(src, x, y, constant_value);
+                        *dst_data = res;
+                    });
+        }
     }
     else
     {
@@ -211,15 +332,18 @@
 
 typedef struct {
     const char* testName;
-    CT_Image (*generator)(const char* fileName, int width, int height);
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     vx_border_t border;
     int width, height;
+    vx_df_image format;
 } Arg;
 
 #define PARAMETERS \
-    CT_GENERATE_PARAMETERS("randomInput", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ARG, erode3x3_generate_random, NULL), \
-    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ARG, erode3x3_read_image, "lena.bmp")
+    CT_GENERATE_PARAMETERS("randomInput", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ARG, erode3x3_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U8, ARG, erode3x3_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/randomInput", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ARG, erode3x3_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U1, ARG, erode3x3_read_image, "lena.bmp")
 
 TEST_WITH_ARG(Erode3x3, testGraphProcessing, Arg,
     PARAMETERS
@@ -233,7 +357,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -275,7 +399,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -296,4 +420,60 @@
     ASSERT(src_image == 0);
 }
 
-TESTCASE_TESTS(Erode3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+typedef struct {
+    const char* testName;
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    vx_border_t border;
+    int width, height;
+    vx_df_image format;
+    vx_rectangle_t regionShift;
+} ValidRegionTest_Arg;
+
+#ifdef PARAMETERS
+#undef PARAMETERS
+#endif
+#define PARAMETERS \
+    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VALID_REGION_SHRINKS, ARG, erode3x3_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VALID_REGION_SHRINKS, ARG, erode3x3_read_image, "lena.bmp")
+
+TEST_WITH_ARG(Erode3x3, testWithValidRegion, ValidRegionTest_Arg,
+    PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, dst_image = 0;
+
+    CT_Image src = NULL, dst = NULL;
+    vx_border_t border = arg_->border;
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->regionShift;
+
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+
+    ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = ct_create_similar_image(src_image), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(src_image, &rect));
+    ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(src_image, &rect));
+
+    VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
+
+    VX_CALL(vxuErode3x3(context, src_image, dst_image));
+
+    ASSERT_NO_FAILURE(dst = ct_image_from_vx_image(dst_image));
+    ASSERT_NO_FAILURE(ct_adjust_roi(dst, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+
+    ASSERT_NO_FAILURE(ct_adjust_roi(src, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+    ASSERT_NO_FAILURE(erode3x3_check(src, dst, border));
+
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TESTCASE_TESTS(Erode3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing, testWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_export_import_extension.c b/test_conformance/test_export_import_extension.c
index 692088e..7436e75 100644
--- a/test_conformance/test_export_import_extension.c
+++ b/test_conformance/test_export_import_extension.c
@@ -111,7 +111,7 @@
     vx_distribution distribution = vxCreateDistribution(context, 32, 0, 255);
     reference_list[2] = (vx_reference ) distribution;
 
-    vx_threshold threshold = vxCreateThreshold(context, VX_THRESHOLD_TYPE_BINARY, VX_TYPE_UINT8);
+    vx_threshold threshold = vxCreateThresholdForImage(context, VX_THRESHOLD_TYPE_BINARY, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8);
     reference_list[3] = (vx_reference ) threshold;
 
     vx_matrix matrix = vxCreateMatrix(context, VX_TYPE_UINT8, 3, 5);
@@ -166,7 +166,7 @@
     reference_list[12] = (vx_reference ) graph;
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxExportObjectsToMemory( context, 13, &reference_list[0], &uses_list[0], &blob_ptr, &blob_bytes));
-    void * export_blob = malloc(blob_bytes);
+    void * export_blob = ct_alloc_mem(blob_bytes);
     memcpy(export_blob, blob_ptr, blob_bytes);
 
     VX_CALL(vxReleaseImage(&image));
@@ -197,7 +197,7 @@
     import_list[1] = (vx_reference ) lut1;
     vx_distribution distribution1 = vxCreateDistribution(context1, 32, 0, 255);
     import_list[2] = (vx_reference ) distribution1;
-    vx_threshold threshold1 = vxCreateThreshold(context1, VX_THRESHOLD_TYPE_BINARY, VX_TYPE_UINT8);
+    vx_threshold threshold1 = vxCreateThresholdForImage(context1, VX_THRESHOLD_TYPE_BINARY, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8);
     import_list[3] = (vx_reference ) threshold1;
     vx_matrix matrix1 = vxCreateMatrix(context1, VX_TYPE_UINT8, 3, 5);
     import_list[4] = (vx_reference ) matrix1;
@@ -263,7 +263,7 @@
     vxReleaseReference(&name_reference);
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS,vxReleaseImport(&import));
-    free(export_blob);
+    ct_free_mem(export_blob);
 }
 
 TESTCASE_TESTS(ExtensionObject, testExtensionObject)
diff --git a/test_conformance/test_fast.c b/test_conformance/test_fast.c
index f0fb064..5ed8f59 100644
--- a/test_conformance/test_fast.c
+++ b/test_conformance/test_fast.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -301,3 +303,5 @@
 }
 
 TESTCASE_TESTS(FastCorners, testOnNaturalImages)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_gaussian3x3.c b/test_conformance/test_gaussian3x3.c
index ffe3ebe..04fc269 100644
--- a/test_conformance/test_gaussian3x3.c
+++ b/test_conformance/test_gaussian3x3.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -298,3 +300,5 @@
 }
 
 TESTCASE_TESTS(Gaussian3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_gaussianpyramid.c b/test_conformance/test_gaussianpyramid.c
index d0eb3a4..dce0aa0 100644
--- a/test_conformance/test_gaussianpyramid.c
+++ b/test_conformance/test_gaussianpyramid.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -654,5 +656,4 @@
         testReference
 )
 
-
-
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_graph.c b/test_conformance/test_graph.c
index 10f812b..188bd2c 100644
--- a/test_conformance/test_graph.c
+++ b/test_conformance/test_graph.c
@@ -18,7 +18,12 @@
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
+#include <math.h>
+#include <string.h>
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
+/* *****************testGraph tests (vision) *******************************/
 TESTCASE(Graph, CT_VXContext, ct_setup_vx_context, 0)
 
 TEST(Graph, testTwoNodes)
@@ -847,9 +852,6 @@
     ARG("org.khronos.openvx.gaussian_3x3",          VX_KERNEL_GAUSSIAN_3x3),
     ARG("org.khronos.openvx.custom_convolution",    VX_KERNEL_CUSTOM_CONVOLUTION),
     ARG("org.khronos.openvx.gaussian_pyramid",      VX_KERNEL_GAUSSIAN_PYRAMID),
-    ARG("org.khronos.openvx.accumulate",            VX_KERNEL_ACCUMULATE),
-    ARG("org.khronos.openvx.accumulate_weighted",   VX_KERNEL_ACCUMULATE_WEIGHTED),
-    ARG("org.khronos.openvx.accumulate_square",     VX_KERNEL_ACCUMULATE_SQUARE),
     ARG("org.khronos.openvx.minmaxloc",             VX_KERNEL_MINMAXLOC),
     ARG("org.khronos.openvx.convertdepth",          VX_KERNEL_CONVERTDEPTH),
     ARG("org.khronos.openvx.canny_edge_detector",   VX_KERNEL_CANNY_EDGE_DETECTOR),
@@ -867,8 +869,10 @@
     ARG("org.khronos.openvx.optical_flow_pyr_lk",   VX_KERNEL_OPTICAL_FLOW_PYR_LK),
     ARG("org.khronos.openvx.remap",                 VX_KERNEL_REMAP),
     ARG("org.khronos.openvx.halfscale_gaussian",    VX_KERNEL_HALFSCALE_GAUSSIAN),
-    ARG("org.khronos.openvx.min",                   VX_KERNEL_MIN),
-    ARG("org.khronos.openvx.max",                   VX_KERNEL_MAX),
+    ARG("org.khronos.openvx.weightedaverage",       VX_KERNEL_WEIGHTED_AVERAGE),
+    ARG("org.khronos.openvx.non_linear_filter",     VX_KERNEL_NON_LINEAR_FILTER),
+    ARG("org.khronos.openvx.laplacian_pyramid",     VX_KERNEL_LAPLACIAN_PYRAMID),
+    ARG("org.khronos.openvx.laplacian_reconstruct", VX_KERNEL_LAPLACIAN_RECONSTRUCT),
     )
 {
     vx_context context = context_->vx_context_;
@@ -895,34 +899,6 @@
     VX_CALL(vxReleaseKernel(&kernel));
 }
 
-TEST(Graph, testAllocateUserKernelId)
-{
-    vx_context context = context_->vx_context_;
-    vx_enum   kernel_id = 0;
-
-    ASSERT_EQ_VX_STATUS(vxAllocateUserKernelId(NULL, &kernel_id), VX_ERROR_INVALID_REFERENCE);
-    ASSERT_NE_VX_STATUS(vxAllocateUserKernelId(context, NULL), VX_SUCCESS);
-
-    VX_CALL(vxAllocateUserKernelId(context, &kernel_id));
-
-    ASSERT(kernel_id >= VX_KERNEL_BASE(VX_ID_USER, 0));
-    ASSERT(kernel_id < (VX_KERNEL_BASE(VX_ID_USER, 0) + 4096));
-}
-
-TEST(Graph, testAllocateUserKernelLibraryId)
-{
-    vx_context context = context_->vx_context_;
-    vx_enum   library_id = 0;
-
-    ASSERT_EQ_VX_STATUS(vxAllocateUserKernelLibraryId(NULL, &library_id), VX_ERROR_INVALID_REFERENCE);
-    ASSERT_NE_VX_STATUS(vxAllocateUserKernelLibraryId(context, NULL), VX_SUCCESS);
-
-    VX_CALL(vxAllocateUserKernelLibraryId(context, &library_id));
-
-    ASSERT(library_id >= 1);
-    ASSERT(library_id <= 255);
-}
-
 void test_case_1(vx_context context, vx_uint32 width, vx_uint32 height)
 {
     vx_image src1 = 0;
@@ -1649,6 +1625,7 @@
     vx_size ref_levels = 0;
     vx_size tst_levels = 0;
     vx_enum type = VX_TYPE_INVALID;
+    int roi_adj = 0;
 
     VX_CALL(vxQueryReference(ref, VX_REFERENCE_TYPE, &type, sizeof(type)));
 
@@ -1679,16 +1656,15 @@
             {
                 if (i > 0)
                 {
-                    if (VX_SCALE_PYRAMID_ORB == scale)
+                    int next_roi_adj = ceil((double)scale*(2+roi_adj));
+
+                    if (next_roi_adj != roi_adj)
                     {
-                        ct_adjust_roi(img1, 2, 2, 2, 2);
-                        ct_adjust_roi(img2, 2, 2, 2, 2);
+                        roi_adj = roi_adj + ceil((double)(scale) * 2);
                     }
-                    else if (VX_SCALE_PYRAMID_HALF == scale)
-                    {
-                        ct_adjust_roi(img1, 1, 1, 1, 1);
-                        ct_adjust_roi(img2, 1, 1, 1, 1);
-                    }
+
+                    ct_adjust_roi(img1, roi_adj, roi_adj, roi_adj, roi_adj);
+                    ct_adjust_roi(img2, roi_adj, roi_adj, roi_adj, roi_adj);
                 }
             }
 
@@ -1858,12 +1834,17 @@
         vx_int32 val1 = 16;
         vx_int32 val2 = 32;
         vx_node node = 0;
+        vx_pixel_value_t low_pixel;
+        vx_pixel_value_t high_pixel;
+        memset(&low_pixel, 0, sizeof(low_pixel));
+        memset(&high_pixel, 0, sizeof(high_pixel));
+        low_pixel.U8 = val1;
+        high_pixel.U8 = val2;
 
         ASSERT_VX_OBJECT(src = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
         ASSERT_VX_OBJECT(dst = vxCreateImage(context, 320, 240, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-        ASSERT_VX_OBJECT(threshold = vxCreateThreshold(context, VX_THRESHOLD_TYPE_RANGE, VX_TYPE_UINT8), VX_TYPE_THRESHOLD);
-        VX_CALL(vxSetThresholdAttribute(threshold, VX_THRESHOLD_THRESHOLD_LOWER, &val1, sizeof(val1)));
-        VX_CALL(vxSetThresholdAttribute(threshold, VX_THRESHOLD_THRESHOLD_UPPER, &val2, sizeof(val2)));
+        ASSERT_VX_OBJECT(threshold = vxCreateThresholdForImage(context, VX_THRESHOLD_TYPE_RANGE, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8), VX_TYPE_THRESHOLD);
+        VX_CALL(vxCopyThresholdRange(threshold, &low_pixel, &high_pixel, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
         ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
         ASSERT_VX_OBJECT(node = vxCannyEdgeDetectorNode(graph, src, threshold, 3, VX_NORM_L1, dst), VX_TYPE_NODE);
 
@@ -2336,6 +2317,1779 @@
     ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
 }
 
+TEST(Graph, testvxIsGraphVerified)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, interm_image = 0, dst_image = 0;
+    vx_graph graph = 0;
+    vx_node node1 = 0;
+    vx_bool is_verified = vx_false_e;
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
+    VX_CALL(vxVerifyGraph(graph));
+    is_verified = vxIsGraphVerified(graph);
+    ASSERT_EQ_INT(is_verified, vx_true_e);
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&interm_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node1 == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst_image == 0);
+    ASSERT(interm_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TEST(Graph, testvxProcessGraph)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, interm_image = 0, dst_image = 0;
+    vx_graph graph = 0;
+    vx_node node1 = 0;
+
+    VX_CALL(vxDirective((vx_reference)context, VX_DIRECTIVE_ENABLE_PERFORMANCE));
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
+
+    VX_CALL(vxVerifyGraph(graph));
+    ASSERT_EQ_INT(VX_SUCCESS, vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&interm_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node1 == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst_image == 0);
+    ASSERT(interm_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TEST(Graph, testvxWaitGraph)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, interm_image = 0, dst_image = 0;
+    vx_graph graph = 0;
+    vx_node node1 = 0, node2 = 0;
+    vx_border_t border = { VX_BORDER_UNDEFINED };
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
+    VX_CALL(vxSetNodeAttribute(node1, VX_NODE_BORDER, &border, sizeof(border)));
+    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxScheduleGraph(graph));
+    VX_CALL(vxWaitGraph(graph));
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseNode(&node2));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&interm_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node1 == 0); ASSERT(node2 == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
+}
+
+TEST(Graph, testvxVerifyGraph)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src1_image = 0, src2_image = 0, interm_image = 0, dst_image = 0, dst2_image = 0;
+    vx_graph graph = 0;
+    vx_node node1 = 0, node2 = 0;
+    vx_scalar scale = 0;
+    vx_scalar scale2 = 0;
+    float alpha = 2.0f;
+    int val = 1;
+    vx_status status;
+
+    ASSERT_VX_OBJECT(src1_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src2_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst2_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(scale = vxCreateScalar(context, VX_TYPE_FLOAT32, &alpha), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(scale2 = vxCreateScalar(context, VX_TYPE_INT32, &val), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src1_image, dst_image), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node2 = vxMedian3x3Node(graph, src2_image, dst_image), VX_TYPE_NODE);
+    status = vxVerifyGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_MULTIPLE_WRITERS, status);
+
+    VX_CALL(vxRemoveNode(&node2));
+    ASSERT(node2 == 0);
+    VX_CALL(vxRemoveNode(&node1));
+    ASSERT(node1 == 0);
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src1_image, dst_image), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node2 = vxMedian3x3Node(graph, dst_image, src1_image), VX_TYPE_NODE);
+    status = vxVerifyGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_GRAPH, status);
+
+    VX_CALL(vxRemoveNode(&node2));
+    ASSERT(node2 == 0);
+    VX_CALL(vxRemoveNode(&node1));
+    ASSERT(node1 == 0);
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src1_image, src2_image), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, src2_image, interm_image), VX_TYPE_NODE);
+    status = vxVerifyGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_FORMAT, status);
+
+    VX_CALL(vxRemoveNode(&node2));
+    ASSERT(node2 == 0);
+    VX_CALL(vxRemoveNode(&node1));
+    ASSERT(node1 == 0);
+    ASSERT_VX_OBJECT(node1 = vxWeightedAverageNode(graph, src1_image, scale, src2_image, dst_image), VX_TYPE_NODE);
+    status = vxVerifyGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_VALUE, status);
+
+    VX_CALL(vxRemoveNode(&node1));
+    ASSERT(node1 == 0);
+    ASSERT_VX_OBJECT(node1 = vxWeightedAverageNode(graph, src1_image, scale2, src2_image, dst_image), VX_TYPE_NODE);
+    status = vxVerifyGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_TYPE, status);
+
+    VX_CALL(vxRemoveNode(&node1));
+    ASSERT(node1 == 0);
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src1_image, interm_image), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst2_image), VX_TYPE_NODE);
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseNode(&node2));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&dst2_image));
+    VX_CALL(vxReleaseImage(&src1_image));
+    VX_CALL(vxReleaseImage(&src2_image));
+    VX_CALL(vxReleaseImage(&interm_image));
+    VX_CALL(vxReleaseScalar(&scale));
+    VX_CALL(vxReleaseScalar(&scale2));
+
+    ASSERT(node1 == 0); ASSERT(node2 == 0);
+    ASSERT(graph == 0);
+    ASSERT(scale == 0); ASSERT(scale2 == 0);
+    ASSERT(dst_image == 0); ASSERT(dst2_image == 0); ASSERT(src1_image == 0); ASSERT(src2_image == 0); ASSERT(interm_image == 0);
+}
+
+TEST(Graph, testvxQueryNode)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, dst_image = 0;
+    vx_graph graph = 0;
+    vx_node node1 = 0;
+    vx_perf_t perf;
+    vx_status node_status = VX_SUCCESS;
+    vx_status status = VX_SUCCESS;
+    vx_border_t border = { VX_BORDER_UNDEFINED };
+    vx_border_t border_test = { 0 };
+
+    VX_CALL(vxDirective((vx_reference)context, VX_DIRECTIVE_ENABLE_PERFORMANCE));
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node1 = vxIntegralImageNode(graph, src_image, dst_image), VX_TYPE_NODE);
+    VX_CALL(vxSetNodeAttribute(node1, VX_NODE_BORDER, &border, sizeof(border)));
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    status = vxQueryNode(node1, VX_NODE_PERFORMANCE, &perf, sizeof(perf));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryNode(node1, VX_NODE_STATUS, &node_status, sizeof(node_status));
+    ASSERT_EQ_INT(VX_SUCCESS, node_status);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryNode(node1, VX_NODE_BORDER, &node_status, sizeof(node_status));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    status = vxQueryNode(node1, VX_NODE_BORDER, &border_test, sizeof(border_test));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    ASSERT_EQ_INT(VX_BORDER_UNDEFINED, border_test.mode);
+
+    ASSERT(perf.num == 1);
+    ASSERT(perf.beg > 0);
+    ASSERT(perf.min > 0);
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node1 == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TEST(Graph, testvxReleaseNode)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, dst_image = 0;
+    vx_graph graph = 0;
+    vx_node node1 = 0;
+    vx_status status = VX_SUCCESS;
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node1 = vxIntegralImageNode(graph, src_image, dst_image), VX_TYPE_NODE);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    status = vxReleaseNode(&node1);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node1 == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TEST(Graph, testvxSetNodeAttribute)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, interm_image = 0, dst_image = 0;
+    vx_graph graph = 0;
+    vx_node node1 = 0, node2 = 0;
+    vx_border_t border = { VX_BORDER_UNDEFINED };
+    vx_border_t border_test = { 0 };
+    vx_status status = VX_SUCCESS;
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(interm_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U32), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node1 = vxBox3x3Node(graph, src_image, interm_image), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(node2 = vxIntegralImageNode(graph, interm_image, dst_image), VX_TYPE_NODE);
+    status = vxSetNodeAttribute(node1, VX_NODE_BORDER, &border, sizeof(border));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryNode(node1, VX_NODE_BORDER, &border_test, sizeof(vx_border_t));
+    ASSERT_EQ_INT(VX_BORDER_UNDEFINED, border_test.mode);
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseNode(&node2));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&interm_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node1 == 0); ASSERT(node2 == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst_image == 0); ASSERT(interm_image == 0); ASSERT(src_image == 0);
+}
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
+/* *****************testGraphBase tests*******************************/
+TESTCASE(GraphBase, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST(GraphBase, testAllocateUserKernelId)
+{
+    vx_context context = context_->vx_context_;
+    vx_enum   kernel_id = 0;
+
+    ASSERT_EQ_VX_STATUS(vxAllocateUserKernelId(NULL, &kernel_id), VX_ERROR_INVALID_REFERENCE);
+    ASSERT_NE_VX_STATUS(vxAllocateUserKernelId(context, NULL), VX_SUCCESS);
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_id));
+
+    ASSERT(kernel_id >= VX_KERNEL_BASE(VX_ID_USER, 0));
+    ASSERT(kernel_id < (VX_KERNEL_BASE(VX_ID_USER, 0) + 4096));
+}
+
+TEST(GraphBase, testAllocateUserKernelLibraryId)
+{
+    vx_context context = context_->vx_context_;
+    vx_enum   library_id = 0;
+
+    ASSERT_EQ_VX_STATUS(vxAllocateUserKernelLibraryId(NULL, &library_id), VX_ERROR_INVALID_REFERENCE);
+    ASSERT_NE_VX_STATUS(vxAllocateUserKernelLibraryId(context, NULL), VX_SUCCESS);
+
+    VX_CALL(vxAllocateUserKernelLibraryId(context, &library_id));
+
+    ASSERT(library_id >= 1);
+    ASSERT(library_id <= 255);
+}
+
+TEST(GraphBase, testGetUserStructNameByEnum)
+{
+    vx_context context = context_->vx_context_;
+    vx_char* type_name = "VX_TYPE_CHAR";
+    vx_enum user_struct_type = vxRegisterUserStructWithName(context, VX_MAX_REFERENCE_NAME, type_name);
+    vx_char out_name[VX_MAX_REFERENCE_NAME];
+
+    ASSERT_EQ_VX_STATUS(vxGetUserStructNameByEnum(NULL, user_struct_type, type_name, VX_MAX_REFERENCE_NAME), VX_ERROR_INVALID_PARAMETERS);
+    ASSERT_EQ_VX_STATUS(vxGetUserStructNameByEnum(context, VX_TYPE_ERROR, type_name, VX_MAX_REFERENCE_NAME), VX_FAILURE);
+    ASSERT_EQ_VX_STATUS(vxGetUserStructNameByEnum(context, user_struct_type, type_name, 0), VX_ERROR_NO_MEMORY);
+    ASSERT_EQ_VX_STATUS(vxGetUserStructNameByEnum(context, user_struct_type, out_name, VX_MAX_REFERENCE_NAME), VX_SUCCESS);
+    int ret = strncmp(type_name, out_name, strlen(type_name));
+    ASSERT_EQ_VX_STATUS(ret, 0);
+}
+
+TEST(GraphBase, testGetUserStructEnumByName)
+{
+    vx_context context = context_->vx_context_;
+    vx_char* type_name = "VX_TYPE_CHAR";
+    vx_enum user_struct_type = vxRegisterUserStructWithName(context, VX_MAX_REFERENCE_NAME, type_name);
+    vx_enum out_type;
+
+    ASSERT_EQ_VX_STATUS(vxGetUserStructEnumByName(context, NULL, &user_struct_type), VX_FAILURE);
+    ASSERT_EQ_VX_STATUS(vxGetUserStructEnumByName(context, type_name, &out_type), VX_SUCCESS);
+    ASSERT_EQ_VX_STATUS(out_type, user_struct_type);
+}
+
+TEST(GraphBase, testRegisterUserStructWithName)
+{
+    vx_context context = context_->vx_context_;
+    vx_char* type_name = "VX_TYPE_CHAR";
+
+    ASSERT_EQ_VX_STATUS(vxRegisterUserStructWithName(NULL, VX_MAX_REFERENCE_NAME, type_name), VX_TYPE_INVALID);
+    ASSERT_EQ_VX_STATUS(vxRegisterUserStructWithName(context, 0, type_name), VX_TYPE_INVALID);
+    ASSERT_NE_VX_STATUS(vxRegisterUserStructWithName(context, VX_MAX_REFERENCE_NAME, type_name), VX_TYPE_INVALID);
+}
+
+TEST(GraphBase, testvxCreateGraph)
+{
+    vx_context context = context_->vx_context_;
+    vx_context context_test = 0;
+    vx_graph graph = NULL;
+
+    graph = vxCreateGraph(context_test);
+    ASSERT_EQ_PTR(graph, NULL);
+    graph = vxCreateGraph(context);
+    ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(GraphBase, testvxIsGraphVerifiedBase)
+{
+    vx_context context = context_->vx_context_;
+    vx_context context_test = 0;
+    vx_graph graph = NULL;
+    vx_bool is_verified = vx_false_e;
+
+    graph = vxCreateGraph(context_test);
+    is_verified = vxIsGraphVerified(graph);
+    ASSERT_EQ_INT(is_verified, vx_false_e);
+    graph = vxCreateGraph(context);
+    is_verified = vxIsGraphVerified(graph);
+    ASSERT_EQ_INT(is_verified, vx_false_e);
+    vx_status status = vxVerifyGraph(graph);
+    if (status == VX_SUCCESS)
+    {
+        is_verified = vxIsGraphVerified(graph);
+        ASSERT_EQ_INT(is_verified, vx_true_e);
+    }
+    if (status != VX_SUCCESS)
+    {
+        is_verified = vxIsGraphVerified(graph);
+        ASSERT_EQ_INT(is_verified, vx_false_e);
+    }
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(GraphBase, testvxProcessGraphBase)
+{
+    vx_context context = context_->vx_context_;
+    vx_context context_test = 0;
+    vx_graph graph = NULL;
+    vx_status status = VX_SUCCESS;
+
+    graph = vxCreateGraph(context_test);
+    status = vxProcessGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    graph = vxCreateGraph(context);
+    status = vxProcessGraph(graph);
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(GraphBase, testvxQueryGraph)
+{
+    vx_context context = context_->vx_context_;
+    vx_context context_test = 0;
+    vx_graph graph = NULL;
+    char * test = (char*)ct_alloc_mem(sizeof(vx_perf_t));
+    vx_status status = VX_SUCCESS;
+
+    graph = vxCreateGraph(context_test);
+    status = vxQueryGraph(graph, VX_GRAPH_PERFORMANCE, test, sizeof(test));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    graph = vxCreateGraph(context);
+    status = vxQueryGraph(graph, VX_GRAPH_PERFORMANCE, test, 0);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    VX_CALL(vxQueryGraph(graph, VX_GRAPH_PERFORMANCE, test, sizeof(vx_perf_t)));
+
+    status = vxQueryGraph(graph, VX_GRAPH_STATE, test, 0);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    VX_CALL(vxQueryGraph(graph, VX_GRAPH_STATE, test, sizeof(vx_enum)));
+
+    status = vxQueryGraph(graph, VX_GRAPH_NUMNODES, test, 0);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    VX_CALL(vxQueryGraph(graph, VX_GRAPH_NUMNODES, test, sizeof(vx_uint32)));
+
+    status = vxQueryGraph(graph, VX_GRAPH_NUMPARAMETERS, test, 0);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    VX_CALL(vxQueryGraph(graph, VX_GRAPH_NUMPARAMETERS, test, sizeof(vx_uint32)));
+
+    status = vxQueryGraph(graph, VX_GRAPH_STATE_ABANDONED, test, 0);
+    ASSERT_EQ_INT(VX_ERROR_NOT_SUPPORTED, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    ct_free_mem(test);
+}
+
+TEST(GraphBase, testvxWaitGraphBase)
+{
+    vx_context context = context_->vx_context_;
+    vx_context context_test = 0;
+    vx_graph graph = NULL;
+    vx_status status = VX_SUCCESS;
+
+    graph = vxCreateGraph(context_test);
+    status = vxWaitGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    graph = vxCreateGraph(context);
+    status = vxWaitGraph(graph);
+    ASSERT_EQ_INT(VX_FAILURE, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(GraphBase, testvxVerifyGraphBase)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = NULL;
+    vx_status status = VX_SUCCESS;
+
+    graph = vxCreateGraph(context);
+    status = vxVerifyGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_GRAPH, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(GraphBase, testvxScheduleGraph)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = NULL;
+    vx_status status = VX_SUCCESS;
+
+    status = vxScheduleGraph(graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    graph = vxCreateGraph(context);
+    status = vxScheduleGraph(graph);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(GraphBase, testvxReleaseGraph)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = NULL;
+    vx_status status = VX_SUCCESS;
+
+    status = vxReleaseGraph(&graph);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    graph = vxCreateGraph(context);
+    status = vxReleaseGraph(&graph);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+}
+
+TEST(GraphBase, testvxQueryNodeBase)
+{
+    vx_node node = 0;
+    vx_size size = 0;
+    vx_perf_t perf = { 0 };
+    void* ptr = NULL;
+    vx_border_t border = { 0 };
+    vx_bool flag = vx_true_e;
+    vx_uint32 numParams = 0;
+    vx_status status = VX_SUCCESS;
+
+    status = vxQueryNode(node, VX_NODE_PERFORMANCE, &perf, sizeof(vx_perf_t));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_STATUS, &status, sizeof(vx_status));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_LOCAL_DATA_SIZE, &size, sizeof(size));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_LOCAL_DATA_PTR, &ptr, sizeof(ptr));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_BORDER, &border, sizeof(vx_border_t));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_PARAMETERS, &numParams, sizeof(numParams));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_IS_REPLICATED, &flag, sizeof(flag));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_REPLICATE_FLAGS, &size, sizeof(size));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_NODE_VALID_RECT_RESET, &flag, sizeof(flag));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    status = vxQueryNode(node, VX_ERROR_NOT_SUPPORTED, &size, sizeof(size));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+}
+
+TEST(GraphBase, testvxReleaseNodeBase)
+{
+    vx_node node = 0;
+    vx_status status = VX_SUCCESS;
+    status = vxReleaseNode(&node);
+    ASSERT_EQ_VX_STATUS(VX_ERROR_INVALID_REFERENCE, status);
+}
+
+TEST(GraphBase, testvxRemoveNodeBase)
+{
+    vx_node node = 0;
+    vx_status status = VX_SUCCESS;
+    status = vxRemoveNode(&node);
+    ASSERT_EQ_VX_STATUS(VX_ERROR_INVALID_REFERENCE, status);
+}
+
+TEST(GraphBase, testvxReplicateNodeBase)
+{
+    vx_context context = context_->vx_context_;
+    vx_node node = 0;
+    vx_graph graph = NULL;
+    vx_status status = VX_SUCCESS;
+    vx_bool replicate[] = { vx_true_e, vx_true_e, vx_false_e, vx_true_e };
+
+    status = vxReplicateNode(graph, node, replicate, 4);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+    graph = vxCreateGraph(context);
+    ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
+    status = vxReplicateNode(graph, node, replicate, 4);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(GraphBase, testvxSetNodeAttributeBase)
+{
+    vx_node node1 = 0;
+    vx_border_t border = { VX_BORDER_UNDEFINED };
+    vx_status status = VX_SUCCESS;
+
+    status = vxSetNodeAttribute(node1, VX_NODE_BORDER, &border, sizeof(border));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    ASSERT(node1 == 0);
+}
+
+#ifdef OPENVX_USE_ENHANCED_VISION
+
+/* *****************testKernelName_enhanced tests*******************************/
+TESTCASE(GraphEnhanced, CT_VXContext, ct_setup_vx_context, 0)
+TEST_WITH_ARG(GraphEnhanced, testKernelName_enhanced, kernel_name_arg,
+    ARG("org.khronos.openvx.min",                        VX_KERNEL_MIN),
+    ARG("org.khronos.openvx.max",                        VX_KERNEL_MAX),
+    ARG("org.khronos.openvx.match_template",             VX_KERNEL_MATCH_TEMPLATE),
+    ARG("org.khronos.openvx.lbp",                        VX_KERNEL_LBP),
+    ARG("org.khronos.openvx.hough_lines_probabilistic",  VX_KERNEL_HOUGH_LINES_P),
+    ARG("org.khronos.openvx.tensor_multiply",            VX_KERNEL_TENSOR_MULTIPLY),
+    ARG("org.khronos.openvx.tensor_add",                 VX_KERNEL_TENSOR_ADD),
+    ARG("org.khronos.openvx.tensor_subtract",            VX_KERNEL_TENSOR_SUBTRACT),
+    ARG("org.khronos.openvx.tensor_table_lookup",        VX_KERNEL_TENSOR_TABLE_LOOKUP),
+    ARG("org.khronos.openvx.tensor_transpose",           VX_KERNEL_TENSOR_TRANSPOSE),
+    ARG("org.khronos.openvx.tensor_convert_depth",       VX_KERNEL_TENSOR_CONVERT_DEPTH),
+    ARG("org.khronos.openvx.tensor_matrix_multiply ",    VX_KERNEL_TENSOR_MATRIX_MULTIPLY),
+    ARG("org.khronos.openvx.copy_node",                  VX_KERNEL_COPY),
+    ARG("org.khronos.openvx.nonmaxsuppression",          VX_KERNEL_NON_MAX_SUPPRESSION),
+    ARG("org.khronos.openvx.scalar_operation",           VX_KERNEL_SCALAR_OPERATION),
+    ARG("org.khronos.openvx.hogfeatures",                VX_KERNEL_HOG_FEATURES),
+    ARG("org.khronos.openvx.hog_cells",                  VX_KERNEL_HOG_CELLS),
+    ARG("org.khronos.openvx.bilateral_filter ",          VX_KERNEL_BILATERAL_FILTER),
+    ARG("org.khronos.openvx.select",                     VX_KERNEL_SELECT),
+    )
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum   kernel_id = 0;
+
+    EXPECT_VX_OBJECT(kernel = vxGetKernelByName(context, arg_->name), VX_TYPE_KERNEL);
+
+    if (CT_HasFailure())
+    {
+        vx_char name[VX_MAX_KERNEL_NAME] = { 0 };
+
+        ASSERT_VX_OBJECT(kernel = vxGetKernelByEnum(context, arg_->kernel_id), VX_TYPE_KERNEL);
+        VX_CALL(vxQueryKernel(kernel, VX_KERNEL_NAME, &name, sizeof(name)));
+        printf("\tExpected kernel name is: %s\n", arg_->name);
+        printf("\tActual kernel name is:   %-*s\n", VX_MAX_KERNEL_NAME, name);
+    }
+    else
+    {
+        VX_CALL(vxQueryKernel(kernel, VX_KERNEL_ENUM, &kernel_id, sizeof(kernel_id)));
+        EXPECT_EQ_INT(arg_->kernel_id, kernel_id);
+    }
+
+    VX_CALL(vxReleaseKernel(&kernel));
+}
+
+#endif //OPENVX_USE_ENHANCED_VISION
+
+#if defined OPENVX_CONFORMANCE_NEURAL_NETWORKS || OPENVX_CONFORMANCE_NNEF_IMPORT
+
+/* *****************UserKernelsOfNNAndNNEF tests*******************************/
+TESTCASE(UserKernelsOfNNAndNNEF, CT_VXContext, ct_setup_vx_context, 0)
+
+#define VX_USER_KERNEL_CONFORMANCE_NAME  "org.khronos.openvx.test.user.kernel.tensor"
+#define VX_MAX_TENSOR_DIMENSIONS 6
+#define Q78_FIXED_POINT_POSITION 8
+#define MAX_DIMS_TEST1   4
+#define TEST_TENSOR_MIN_DIM_SZ   1
+#define TEST_TENSOR_MAX_DIM_SZ   20
+
+
+static vx_status VX_CALLBACK userKernelValidate1(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
+{
+    ASSERT_(return VX_FAILURE, num == 2);
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK userKernelValidate2(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
+{
+    vx_size num_of_dims = 0;
+    vx_size dims[VX_MAX_TENSOR_DIMENSIONS] = {0};
+    vx_enum data_type = 0;
+    vx_int8 fixed_point_pos = 0;
+    vx_tensor input = 0;
+
+    ASSERT_(return VX_FAILURE, num == 2);
+
+    input = (vx_tensor)parameters[0];
+
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_NUMBER_OF_DIMS, &num_of_dims, sizeof(num_of_dims)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_DIMS, dims, sizeof(vx_size) * num_of_dims));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_DATA_TYPE, &data_type, sizeof(data_type)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_FIXED_POINT_POSITION, &fixed_point_pos, sizeof(fixed_point_pos)));
+
+    VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(metas[1], VX_TENSOR_NUMBER_OF_DIMS, &num_of_dims, sizeof(num_of_dims)));
+    VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(metas[1], VX_TENSOR_DIMS, dims, sizeof(vx_size) * num_of_dims));
+    VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(metas[1], VX_TENSOR_DATA_TYPE, &data_type, sizeof(data_type)));
+    VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(metas[1], VX_TENSOR_FIXED_POINT_POSITION, &fixed_point_pos, sizeof(fixed_point_pos)));
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK userKernelValidate3(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
+{
+    ASSERT_(return VX_FAILURE, num == 2);
+
+    VX_CALL_(return VX_FAILURE, vxSetMetaFormatFromReference(metas[1], parameters[0]));
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK userKernelValidate4(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
+{
+    vx_tensor input;
+    vx_size expect_num_of_dims = 0;
+    vx_size expect_dims[VX_MAX_TENSOR_DIMENSIONS] = {0};
+    vx_enum expect_data_type = 0;
+    vx_int8 expect_fixed_point_pos = 0;
+    vx_size actual_num_of_dims = 1;
+    vx_size actual_dims[VX_MAX_TENSOR_DIMENSIONS] = {1};
+    vx_enum actual_data_type = 1;
+    vx_int8 actual_fixed_point_pos = 1;
+
+    input = (vx_tensor)parameters[0];
+
+    ASSERT_(return VX_FAILURE, num == 2);
+
+    VX_CALL_(return VX_FAILURE, vxSetMetaFormatFromReference(metas[1], parameters[0]));
+
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_NUMBER_OF_DIMS, &actual_num_of_dims, sizeof(actual_num_of_dims)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_DIMS, actual_dims, sizeof(vx_size) * actual_num_of_dims));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_DATA_TYPE, &actual_data_type, sizeof(actual_data_type)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_FIXED_POINT_POSITION, &actual_fixed_point_pos, sizeof(actual_fixed_point_pos)));
+
+    VX_CALL_(return VX_FAILURE, vxQueryMetaFormatAttribute(metas[1], VX_TENSOR_NUMBER_OF_DIMS, &expect_num_of_dims, sizeof(expect_num_of_dims)));
+    VX_CALL_(return VX_FAILURE, vxQueryMetaFormatAttribute(metas[1], VX_TENSOR_DIMS, expect_dims, sizeof(vx_size) * expect_num_of_dims));
+    VX_CALL_(return VX_FAILURE, vxQueryMetaFormatAttribute(metas[1], VX_TENSOR_DATA_TYPE, &expect_data_type, sizeof(expect_data_type)));
+    VX_CALL_(return VX_FAILURE, vxQueryMetaFormatAttribute(metas[1], VX_TENSOR_FIXED_POINT_POSITION, &expect_fixed_point_pos, sizeof(expect_fixed_point_pos)));
+
+    EXPECT_EQ_INT(expect_num_of_dims, actual_num_of_dims);
+    EXPECT_EQ_INT(expect_data_type, actual_data_type);
+    EXPECT_EQ_INT(expect_fixed_point_pos, actual_fixed_point_pos);
+    for (vx_uint8 i = 0; i < actual_num_of_dims; i++)
+    {
+        EXPECT_EQ_INT(expect_dims[i], actual_dims[i]);
+    }
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK userKernelProc1(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    vx_tensor input, output;
+    ASSERT_(return VX_FAILURE, num == 2);
+    ASSERT_VX_OBJECT_(return VX_FAILURE, input  = (vx_tensor)parameters[0], VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT_(return VX_FAILURE, output = (vx_tensor)parameters[1], VX_TYPE_TENSOR);
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK userKernelProc2(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    vx_tensor input, output;
+    vx_size expect_num_of_dims = 0;
+    vx_size expect_dims[VX_MAX_TENSOR_DIMENSIONS] = {0};
+    vx_enum expect_data_type = 0;
+    vx_int8 expect_fixed_point_pos = 0;
+    vx_size actual_num_of_dims = 1;
+    vx_size actual_dims[VX_MAX_TENSOR_DIMENSIONS] = {1};
+    vx_enum actual_data_type = 1;
+    vx_int8 actual_fixed_point_pos = 1;
+
+    ASSERT_(return VX_FAILURE, num == 2);
+    ASSERT_VX_OBJECT_(return VX_FAILURE, input  = (vx_tensor)parameters[0], VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT_(return VX_FAILURE, output = (vx_tensor)parameters[1], VX_TYPE_TENSOR);
+
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_NUMBER_OF_DIMS, &actual_num_of_dims, sizeof(actual_num_of_dims)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_DIMS, actual_dims, sizeof(vx_size) * actual_num_of_dims));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_DATA_TYPE, &actual_data_type, sizeof(actual_data_type)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(input, VX_TENSOR_FIXED_POINT_POSITION, &actual_fixed_point_pos, sizeof(actual_fixed_point_pos)));
+
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(output, VX_TENSOR_NUMBER_OF_DIMS, &expect_num_of_dims, sizeof(expect_num_of_dims)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(output, VX_TENSOR_DIMS, expect_dims, sizeof(vx_size) * expect_num_of_dims));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(output, VX_TENSOR_DATA_TYPE, &expect_data_type, sizeof(expect_data_type)));
+    VX_CALL_(return VX_FAILURE, vxQueryTensor(output, VX_TENSOR_FIXED_POINT_POSITION, &expect_fixed_point_pos, sizeof(expect_fixed_point_pos)));
+
+    EXPECT_EQ_INT(expect_num_of_dims, actual_num_of_dims);
+    EXPECT_EQ_INT(expect_data_type, actual_data_type);
+    EXPECT_EQ_INT(expect_fixed_point_pos, actual_fixed_point_pos);
+    for (vx_uint8 i = 0; i < actual_num_of_dims; i++)
+    {
+        EXPECT_EQ_INT(expect_dims[i], actual_dims[i]);
+    }
+
+    return VX_SUCCESS;
+}
+
+
+TEST(UserKernelsOfNNAndNNEF, testvxAddUserKernel)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc1,
+            numParams,
+            userKernelValidate1,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+TEST(UserKernelsOfNNAndNNEF, testvxRemoveKernel)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc1,
+            numParams,
+            userKernelValidate1,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxRemoveKernel(kernel));
+}
+
+TEST(UserKernelsOfNNAndNNEF, testvxFinalizeKernel)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc1,
+            numParams,
+            userKernelValidate1,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxFinalizeKernel(kernel));
+
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+TEST(UserKernelsOfNNAndNNEF, testvxAddParameterToKernel)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_uint32 numParams = 2;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc1,
+            numParams,
+            userKernelValidate2,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in_tensor));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out_tensor));
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+TEST(UserKernelsOfNNAndNNEF, testvxSetKernelAttribute)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_size actual_datasize = 256;
+    vx_size expect_datasize = 0;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc1,
+            numParams,
+            userKernelValidate2,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxSetKernelAttribute(kernel, VX_KERNEL_LOCAL_DATA_SIZE, &actual_datasize, sizeof(actual_datasize)));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxQueryKernel(kernel, VX_KERNEL_LOCAL_DATA_SIZE, &expect_datasize, sizeof(expect_datasize)));
+    EXPECT_EQ_INT(expect_datasize, actual_datasize);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+
+    expect_datasize = 0;
+    VX_CALL(vxQueryNode(node, VX_NODE_LOCAL_DATA_SIZE, &expect_datasize, sizeof(expect_datasize)));
+    EXPECT_EQ_INT(expect_datasize, actual_datasize);
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+/* *****************MetaFormatOfNNAndNNEF tests*******************************/
+TESTCASE(MetaFormatOfNNAndNNEF, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST(MetaFormatOfNNAndNNEF, testvxSetMetaFormatAttribute)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc2,
+            numParams,
+            userKernelValidate2,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in_tensor));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out_tensor));
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+TEST(MetaFormatOfNNAndNNEF, testvxSetMetaFormatFromReference)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc2,
+            numParams,
+            userKernelValidate3,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in_tensor));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out_tensor));
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+TEST(MetaFormatOfNNAndNNEF, testvxQueryMetaFormatAttribute)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_USER_KERNEL_CONFORMANCE_NAME,
+            kernel_enum,
+            userKernelProc2,
+            numParams,
+            userKernelValidate4,
+            NULL,
+            NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT,  VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in_tensor));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out_tensor));
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+/* *****************VxKernelOfNNAndNNEF tests*******************************/
+TESTCASE(VxKernelOfNNAndNNEF, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST(VxKernelOfNNAndNNEF, testvxGetKernelByEnum)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate1,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByEnum(context, kernel_enum), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+TEST(VxKernelOfNNAndNNEF, testvxGetKernelByName)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate1,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+TEST(VxKernelOfNNAndNNEF, testvxQueryKernel)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_enum test_kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+    vx_uint32 para_num = 0;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate1,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxQueryKernel(kernel, VX_KERNEL_ENUM, &test_kernel_enum, sizeof(test_kernel_enum)));
+    EXPECT_EQ_INT(kernel_enum, test_kernel_enum);
+    VX_CALL(vxQueryKernel(kernel, VX_KERNEL_PARAMETERS, &para_num, sizeof(vx_uint32)));
+    EXPECT_EQ_INT(2, para_num);
+
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+TEST(VxKernelOfNNAndNNEF, testvxReleaseKernel)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate1,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+
+/* *****************VxParameterOfNNAndNNEF tests*******************************/
+TESTCASE(VxParameterOfNNAndNNEF, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST(VxParameterOfNNAndNNEF, test_vxGetKernelParameterByIndex)
+{
+    vx_context context = context_->vx_context_;
+    vx_uint32 ref_count0 = 0;
+    vx_uint32 ref_count1 = 0;
+    vx_reference ref = 0;
+    vx_kernel kernel = 0;
+    vx_parameter parameter = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate1,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    EXPECT_VX_OBJECT(kernel = vxGetKernelByEnum(context, kernel_enum), VX_TYPE_KERNEL);
+    EXPECT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, 0), VX_TYPE_PARAMETER);
+    ref = (vx_reference)parameter;
+    ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
+    VX_CALL(vxRetainReference(ref));
+    ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+    ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
+    VX_CALL(vxReleaseReference(&ref));
+    ref = (vx_reference)parameter;
+    ref_count1 = 0;
+    ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+    ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
+
+    VX_CALL(vxRemoveKernel(kernel));
+    VX_CALL(vxReleaseParameter(&parameter));
+}
+
+TEST(VxParameterOfNNAndNNEF, test_vxQueryParameter)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+    vx_parameter parameter = 0;
+    vx_enum kernel_enum = 0u;
+    vx_uint32 numParams = 2;
+    vx_uint32 index = 256;
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate1,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    EXPECT_VX_OBJECT(kernel = vxGetKernelByEnum(context, kernel_enum), VX_TYPE_KERNEL);
+    EXPECT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, 0), VX_TYPE_PARAMETER);
+    EXPECT_EQ_INT(VX_SUCCESS, vxQueryParameter(parameter, VX_PARAMETER_INDEX, &index, sizeof(vx_uint32)));
+    ASSERT(index == 0);
+    VX_CALL(vxReleaseParameter(&parameter));
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+TEST(VxParameterOfNNAndNNEF, test_vxSetParameterByIndex)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_kernel kernel = 0;
+    vx_enum kernel_enum = 0u;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_uint32 numParams = 2;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate2,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in_tensor));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out_tensor));
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+TEST(VxParameterOfNNAndNNEF, test_vxSetParameterByReference)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_kernel kernel = 0;
+    vx_parameter parameter = 0;
+    vx_enum kernel_enum = 0u;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_uint32 numParams = 2;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate2,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 0), VX_TYPE_PARAMETER);
+    VX_CALL(vxSetParameterByReference(parameter, (vx_reference)in_tensor));
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseParameter(&parameter));
+    ASSERT(parameter == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+TEST(VxParameterOfNNAndNNEF, test_vxGetParameterByIndex)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_kernel kernel = 0;
+    vx_parameter parameter = 0;
+    vx_enum kernel_enum = 0u;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_tensor test_tensor = 0;
+    vx_uint32 numParams = 2;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate2,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in_tensor));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out_tensor));
+
+    ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 0), VX_TYPE_PARAMETER);
+    VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &test_tensor, sizeof(test_tensor)));
+    ASSERT_VX_OBJECT(test_tensor, VX_TYPE_TENSOR);
+    VX_CALL(vxReleaseTensor(&test_tensor));
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseParameter(&parameter));
+    ASSERT(parameter == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+TEST(VxParameterOfNNAndNNEF, test_vxReleaseParameter)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_kernel kernel = 0;
+    vx_parameter parameter = 0;
+    vx_enum kernel_enum = 0u;
+    vx_tensor in_tensor = 0;
+    vx_tensor out_tensor = 0;
+    vx_uint32 numParams = 2;
+    vx_enum data_type = VX_TYPE_INT16;
+    vx_int8 fixed_point_position = Q78_FIXED_POINT_POSITION;
+    vx_size max_dims = MAX_DIMS_TEST1;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    VX_CALL(vxAllocateUserKernelId(context, &kernel_enum));
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_USER_KERNEL_CONFORMANCE_NAME,
+        kernel_enum,
+        userKernelProc1,
+        numParams,
+        userKernelValidate2,
+        NULL,
+        NULL), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxAddParameterToKernel(kernel, 1, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
+    VX_CALL(vxFinalizeKernel(kernel));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+    }
+
+    in_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    out_tensor = vxCreateTensor(context, max_dims, tensor_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)in_tensor));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)out_tensor));
+
+    ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 0), VX_TYPE_PARAMETER);
+
+    VX_CALL(vxReleaseNode(&node));
+    ASSERT(node == 0);
+
+    VX_CALL(vxReleaseKernel(&kernel));
+    ASSERT(kernel == 0);
+
+    VX_CALL(vxReleaseParameter(&parameter));
+    ASSERT(parameter == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    EXPECT_EQ_PTR(0, graph);
+
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, VX_USER_KERNEL_CONFORMANCE_NAME), VX_TYPE_KERNEL);
+    VX_CALL(vxRemoveKernel(kernel));
+
+    VX_CALL(vxReleaseTensor(&in_tensor));
+    EXPECT_EQ_PTR(NULL, in_tensor);
+
+    VX_CALL(vxReleaseTensor(&out_tensor));
+    EXPECT_EQ_PTR(NULL, out_tensor);
+
+    ct_free_mem(tensor_dims);
+}
+
+#endif //OPENVX_CONFORMANCE_NEURAL_NETWORKS || OPENVX_CONFORMANCE_NNEF_IMPORT
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
 
 TESTCASE_TESTS(Graph,
         testTwoNodes,
@@ -2353,10 +4107,74 @@
         testNodePerformance,
         testGraphPerformance,
         testKernelName,
-        testAllocateUserKernelId,
-        testAllocateUserKernelLibraryId,
         testReplicateNode,
         testImageContainmentRelationship,
         testVerifyGraphLeak,
-        testGraphState
+        testGraphState,
+        testvxIsGraphVerified,
+        testvxProcessGraph,
+        testvxWaitGraph,
+        testvxVerifyGraph,
+        testvxQueryNode,
+        testvxReleaseNode,
+        testvxSetNodeAttribute
         )
+
+#endif
+
+TESTCASE_TESTS(GraphBase,
+        testAllocateUserKernelId,
+        testAllocateUserKernelLibraryId,
+        testRegisterUserStructWithName,
+        testGetUserStructNameByEnum,
+        testGetUserStructEnumByName,
+        testvxCreateGraph,
+        testvxIsGraphVerifiedBase,
+        testvxProcessGraphBase,
+        testvxQueryGraph,
+        testvxWaitGraphBase,
+        testvxVerifyGraphBase,
+        testvxScheduleGraph,
+        testvxReleaseGraph,
+        testvxQueryNodeBase,
+        testvxReleaseNodeBase,
+        testvxRemoveNodeBase,
+        testvxReplicateNodeBase,
+        testvxSetNodeAttributeBase
+        )
+
+#ifdef OPENVX_USE_ENHANCED_VISION
+
+TESTCASE_TESTS(GraphEnhanced, testKernelName_enhanced)
+
+#endif
+
+#if defined OPENVX_CONFORMANCE_NEURAL_NETWORKS || OPENVX_CONFORMANCE_NNEF_IMPORT
+
+TESTCASE_TESTS(UserKernelsOfNNAndNNEF,
+        testvxAddUserKernel,
+        testvxRemoveKernel,
+        testvxFinalizeKernel,
+        testvxAddParameterToKernel,
+        testvxSetKernelAttribute)
+
+TESTCASE_TESTS(MetaFormatOfNNAndNNEF,
+        testvxSetMetaFormatAttribute,
+        testvxSetMetaFormatFromReference,
+        testvxQueryMetaFormatAttribute)
+
+TESTCASE_TESTS(VxKernelOfNNAndNNEF,
+        testvxGetKernelByEnum,
+        testvxGetKernelByName,
+        testvxQueryKernel,
+        testvxReleaseKernel)
+
+TESTCASE_TESTS(VxParameterOfNNAndNNEF,
+        test_vxGetKernelParameterByIndex,
+        test_vxQueryParameter,
+        test_vxSetParameterByIndex,
+        test_vxSetParameterByReference,
+        test_vxGetParameterByIndex,
+        test_vxReleaseParameter)
+
+#endif
diff --git a/test_conformance/test_graph_callbacks.c b/test_conformance/test_graph_callbacks.c
index 351619f..8211d71 100644
--- a/test_conformance/test_graph_callbacks.c
+++ b/test_conformance/test_graph_callbacks.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -200,3 +202,5 @@
         testAbandon,
         testCallbackOrder
         )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_graph_delay.c b/test_conformance/test_graph_delay.c
index aa319fb..ef2a1c1 100644
--- a/test_conformance/test_graph_delay.c
+++ b/test_conformance/test_graph_delay.c
@@ -15,7 +15,10 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
+#include "test_tensor_util.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
@@ -396,9 +399,419 @@
     ASSERT(delay == 0);
 }
 
+typedef struct
+{
+    const char* testName;
+    const char* p;
+    vx_enum item_type;
+} Obj_Array_Arg;
+
+static vx_reference own_create_exemplar(vx_context context, vx_enum item_type)
+{
+    vx_reference exemplar = NULL;
+
+    vx_uint8 value = 0;
+    vx_enum format = VX_DF_IMAGE_U8;
+    vx_uint32 obj_width = 128, obj_height = 128;
+    vx_enum obj_item_type = VX_TYPE_UINT8;
+    vx_size capacity = 100;
+    vx_size levels = 8;
+    vx_float32 scale = 0.5f;
+    vx_size bins = 36;
+    vx_int32 offset = 0;
+    vx_uint32 range = 360;
+    vx_enum thresh_type = VX_THRESHOLD_TYPE_BINARY;
+    vx_size lut_num_items = 100;
+    vx_size m = 5, n = 5;
+
+    switch (item_type)
+    {
+    case VX_TYPE_IMAGE:
+        exemplar = (vx_reference)vxCreateImage(context, obj_width, obj_height, format);
+        break;
+    case VX_TYPE_ARRAY:
+        exemplar = (vx_reference)vxCreateArray(context, obj_item_type, capacity);
+        break;
+    case VX_TYPE_PYRAMID:
+        exemplar = (vx_reference)vxCreatePyramid(context, levels, scale, obj_width, obj_height, format);
+        break;
+    case VX_TYPE_SCALAR:
+        exemplar = (vx_reference)vxCreateScalar(context, obj_item_type, &value);
+        break;
+    case VX_TYPE_MATRIX:
+        exemplar = (vx_reference)vxCreateMatrix(context, obj_item_type, m, n);
+        break;
+    case VX_TYPE_DISTRIBUTION:
+        exemplar = (vx_reference)vxCreateDistribution(context, bins, offset, range);
+        break;
+    case VX_TYPE_REMAP:
+        exemplar = (vx_reference)vxCreateRemap(context, obj_width, obj_height, obj_width, obj_height);
+        break;
+    case VX_TYPE_LUT:
+        exemplar = (vx_reference)vxCreateLUT(context, obj_item_type, lut_num_items);
+        break;
+    case VX_TYPE_THRESHOLD:
+        exemplar = (vx_reference)vxCreateThresholdForImage(context, thresh_type, format, format);
+        break;
+    default:
+        break;
+    }
+
+    return exemplar;
+}
+
+static void own_check_meta(vx_reference item, vx_reference ref)
+{
+    vx_enum ref_type, item_type;
+
+    VX_CALL(vxQueryReference(ref, VX_REFERENCE_TYPE, &ref_type, sizeof(ref_type)));
+
+    VX_CALL(vxQueryReference(item, VX_REFERENCE_TYPE, &item_type, sizeof(item_type)));
+
+    ASSERT(item_type == ref_type);
+
+    switch (item_type)
+    {
+    case VX_TYPE_IMAGE:
+    {
+        vx_uint32 ref_width, item_width;
+        vx_uint32 ref_height, item_height;
+        vx_df_image ref_format, item_format;
+
+        VX_CALL(vxQueryImage((vx_image)ref, VX_IMAGE_WIDTH, &ref_width, sizeof(ref_width)));
+        VX_CALL(vxQueryImage((vx_image)ref, VX_IMAGE_HEIGHT, &ref_height, sizeof(ref_height)));
+        VX_CALL(vxQueryImage((vx_image)ref, VX_IMAGE_FORMAT, &ref_format, sizeof(ref_format)));
+
+        VX_CALL(vxQueryImage((vx_image)item, VX_IMAGE_WIDTH, &item_width, sizeof(item_width)));
+        VX_CALL(vxQueryImage((vx_image)item, VX_IMAGE_HEIGHT, &item_height, sizeof(item_height)));
+        VX_CALL(vxQueryImage((vx_image)item, VX_IMAGE_FORMAT, &item_format, sizeof(item_format)));
+
+        ASSERT(ref_width == item_width);
+        ASSERT(ref_height == item_height);
+        ASSERT(ref_format == item_format);
+    }   break;
+    case VX_TYPE_ARRAY:
+    {
+        vx_size ref_capacity, item_capacity;
+        vx_enum ref_itemtype, item_itemtype;
+
+        VX_CALL(vxQueryArray((vx_array)ref, VX_ARRAY_CAPACITY, &ref_capacity, sizeof(ref_capacity)));
+        VX_CALL(vxQueryArray((vx_array)ref, VX_ARRAY_ITEMTYPE, &ref_itemtype, sizeof(ref_itemtype)));
+
+        VX_CALL(vxQueryArray((vx_array)item, VX_ARRAY_CAPACITY, &item_capacity, sizeof(item_capacity)));
+        VX_CALL(vxQueryArray((vx_array)item, VX_ARRAY_ITEMTYPE, &item_itemtype, sizeof(item_itemtype)));
+
+        ASSERT(ref_capacity == item_capacity);
+        ASSERT(ref_itemtype == item_itemtype);
+    }   break;
+    case VX_TYPE_PYRAMID:
+    {
+        vx_uint32 ref_width, item_width;
+        vx_uint32 ref_height, item_height;
+        vx_df_image ref_format, item_format;
+        vx_size ref_levels, item_levels;
+        vx_float32 ref_scale, item_scale;
+
+        VX_CALL(vxQueryPyramid((vx_pyramid)ref, VX_PYRAMID_WIDTH, &ref_width, sizeof(ref_width)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)ref, VX_PYRAMID_HEIGHT, &ref_height, sizeof(ref_height)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)ref, VX_PYRAMID_FORMAT, &ref_format, sizeof(ref_format)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)ref, VX_PYRAMID_LEVELS, &ref_levels, sizeof(ref_levels)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)ref, VX_PYRAMID_SCALE, &ref_scale, sizeof(ref_scale)));
+
+        VX_CALL(vxQueryPyramid((vx_pyramid)item, VX_PYRAMID_WIDTH, &item_width, sizeof(item_width)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)item, VX_PYRAMID_HEIGHT, &item_height, sizeof(item_height)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)item, VX_PYRAMID_FORMAT, &item_format, sizeof(item_format)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)item, VX_PYRAMID_LEVELS, &item_levels, sizeof(item_levels)));
+        VX_CALL(vxQueryPyramid((vx_pyramid)item, VX_PYRAMID_SCALE, &item_scale, sizeof(item_scale)));
+
+        ASSERT(ref_width == item_width);
+        ASSERT(ref_height == item_height);
+        ASSERT(ref_format == item_format);
+        ASSERT(ref_levels == item_levels);
+        ASSERT(ref_scale == item_scale);
+    }   break;
+    case VX_TYPE_SCALAR:
+    {
+        vx_enum ref_type, item_type;
+
+        VX_CALL(vxQueryScalar((vx_scalar)ref, VX_SCALAR_TYPE, &ref_type, sizeof(ref_type)));
+
+        VX_CALL(vxQueryScalar((vx_scalar)item, VX_SCALAR_TYPE, &item_type, sizeof(item_type)));
+
+        ASSERT(ref_type == item_type);
+    }   break;
+    case VX_TYPE_MATRIX:
+    {
+        vx_enum ref_type, item_type;
+        vx_size ref_rows, item_rows;
+        vx_size ref_cols, item_cols;
+
+        VX_CALL(vxQueryMatrix((vx_matrix)ref, VX_MATRIX_TYPE, &ref_type, sizeof(ref_type)));
+        VX_CALL(vxQueryMatrix((vx_matrix)ref, VX_MATRIX_ROWS, &ref_rows, sizeof(ref_rows)));
+        VX_CALL(vxQueryMatrix((vx_matrix)ref, VX_MATRIX_COLUMNS, &ref_cols, sizeof(ref_cols)));
+
+        VX_CALL(vxQueryMatrix((vx_matrix)item, VX_MATRIX_TYPE, &item_type, sizeof(item_type)));
+        VX_CALL(vxQueryMatrix((vx_matrix)item, VX_MATRIX_ROWS, &item_rows, sizeof(item_rows)));
+        VX_CALL(vxQueryMatrix((vx_matrix)item, VX_MATRIX_COLUMNS, &item_cols, sizeof(item_cols)));
+
+        ASSERT(ref_type == item_type);
+        ASSERT(ref_rows == item_rows);
+        ASSERT(ref_cols == item_cols);
+    }   break;
+    case VX_TYPE_DISTRIBUTION:
+    {
+        vx_size ref_bins, item_bins;
+        vx_int32 ref_offset, item_offset;
+        vx_uint32 ref_range, item_range;
+
+        VX_CALL(vxQueryDistribution((vx_distribution)ref, VX_DISTRIBUTION_BINS, &ref_bins, sizeof(ref_bins)));
+        VX_CALL(vxQueryDistribution((vx_distribution)ref, VX_DISTRIBUTION_OFFSET, &ref_offset, sizeof(ref_offset)));
+        VX_CALL(vxQueryDistribution((vx_distribution)ref, VX_DISTRIBUTION_RANGE, &ref_range, sizeof(ref_range)));
+
+        VX_CALL(vxQueryDistribution((vx_distribution)item, VX_DISTRIBUTION_BINS, &item_bins, sizeof(item_bins)));
+        VX_CALL(vxQueryDistribution((vx_distribution)item, VX_DISTRIBUTION_OFFSET, &item_offset, sizeof(item_offset)));
+        VX_CALL(vxQueryDistribution((vx_distribution)item, VX_DISTRIBUTION_RANGE, &item_range, sizeof(item_range)));
+
+        ASSERT(ref_bins == item_bins);
+        ASSERT(ref_offset == item_offset);
+        ASSERT(ref_range == item_range);
+    }   break;
+    case VX_TYPE_REMAP:
+    {
+        vx_uint32 ref_srcwidth, item_srcwidth;
+        vx_uint32 ref_srcheight, item_srcheight;
+        vx_uint32 ref_dstwidth, item_dstwidth;
+        vx_uint32 ref_dstheight, item_dstheight;
+
+        VX_CALL(vxQueryRemap((vx_remap)ref, VX_REMAP_SOURCE_WIDTH, &ref_srcwidth, sizeof(ref_srcwidth)));
+        VX_CALL(vxQueryRemap((vx_remap)ref, VX_REMAP_SOURCE_HEIGHT, &ref_srcheight, sizeof(ref_srcheight)));
+        VX_CALL(vxQueryRemap((vx_remap)ref, VX_REMAP_DESTINATION_WIDTH, &ref_dstwidth, sizeof(ref_dstwidth)));
+        VX_CALL(vxQueryRemap((vx_remap)ref, VX_REMAP_DESTINATION_HEIGHT, &ref_dstheight, sizeof(ref_dstheight)));
+
+        VX_CALL(vxQueryRemap((vx_remap)item, VX_REMAP_SOURCE_WIDTH, &item_srcwidth, sizeof(item_srcwidth)));
+        VX_CALL(vxQueryRemap((vx_remap)item, VX_REMAP_SOURCE_HEIGHT, &item_srcheight, sizeof(item_srcheight)));
+        VX_CALL(vxQueryRemap((vx_remap)item, VX_REMAP_DESTINATION_WIDTH, &item_dstwidth, sizeof(item_dstwidth)));
+        VX_CALL(vxQueryRemap((vx_remap)item, VX_REMAP_DESTINATION_HEIGHT, &item_dstheight, sizeof(item_dstheight)));
+
+        ASSERT(ref_srcwidth == item_srcwidth);
+        ASSERT(ref_srcheight == item_srcheight);
+        ASSERT(ref_dstwidth == item_dstwidth);
+        ASSERT(ref_dstheight == item_dstheight);
+    }   break;
+    case VX_TYPE_LUT:
+    {
+        vx_enum ref_type, item_type;
+        vx_size ref_count, item_count;
+
+        VX_CALL(vxQueryLUT((vx_lut)ref, VX_LUT_TYPE, &ref_type, sizeof(ref_type)));
+        VX_CALL(vxQueryLUT((vx_lut)ref, VX_LUT_COUNT, &ref_count, sizeof(ref_count)));
+
+        VX_CALL(vxQueryLUT((vx_lut)item, VX_LUT_TYPE, &item_type, sizeof(item_type)));
+        VX_CALL(vxQueryLUT((vx_lut)item, VX_LUT_COUNT, &item_count, sizeof(item_count)));
+
+        ASSERT(ref_type == item_type);
+        ASSERT(ref_count == item_count);
+    }   break;
+    case VX_TYPE_THRESHOLD:
+    {
+        vx_enum ref_type, item_type;
+
+        VX_CALL(vxQueryThreshold((vx_threshold)ref, VX_THRESHOLD_TYPE, &ref_type, sizeof(ref_type)));
+
+        VX_CALL(vxQueryThreshold((vx_threshold)item, VX_THRESHOLD_TYPE, &item_type, sizeof(item_type)));
+
+        ASSERT(ref_type == item_type);
+    }   break;
+    default:
+        ASSERT(0 == 1);
+    }
+}
+
+#define ADD_VX_OBJECT_ARRAY_TYPES(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_IMAGE", __VA_ARGS__, VX_TYPE_IMAGE)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_ARRAY", __VA_ARGS__, VX_TYPE_ARRAY)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_PYRAMID", __VA_ARGS__, VX_TYPE_PYRAMID)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_SCALAR", __VA_ARGS__, VX_TYPE_SCALAR)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_MATRIX", __VA_ARGS__, VX_TYPE_MATRIX)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_DISTRIBUTION", __VA_ARGS__, VX_TYPE_DISTRIBUTION)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_REMAP", __VA_ARGS__, VX_TYPE_REMAP)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_LUT", __VA_ARGS__, VX_TYPE_LUT)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_THRESHOLD", __VA_ARGS__, VX_TYPE_THRESHOLD ))
+
+#define PARAMETERS \
+    CT_GENERATE_PARAMETERS("object_array", ADD_VX_OBJECT_ARRAY_TYPES, ARG, NULL)
+
+TEST_WITH_ARG(GraphDelay, testObjectArray, Obj_Array_Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_delay delay;
+    vx_reference exemplar = NULL;
+    vx_size num_items = 1;
+    vx_enum item_type = arg_->item_type;
+
+    vx_object_array object_array = 0;
+    vx_object_array delayobjarray;
+
+    vx_reference expect_item = NULL;
+    vx_enum expect_type = VX_TYPE_INVALID;
+    vx_size expect_num_items = 0;
+
+    vx_uint32 i;
+
+    ASSERT_VX_OBJECT(exemplar = own_create_exemplar(context, item_type), (enum vx_type_e)item_type);
+
+    /* 1. check if object array can be created with allowed types*/
+    ASSERT_VX_OBJECT(object_array = vxCreateObjectArray(context, exemplar, num_items), VX_TYPE_OBJECT_ARRAY);
+
+    /* 2. create delay with object array*/
+    ASSERT_VX_OBJECT(delay = vxCreateDelay(context, (vx_reference)object_array, 1), VX_TYPE_DELAY);
+
+    ASSERT_VX_OBJECT(delayobjarray = (vx_object_array)vxGetReferenceFromDelay(delay, 0), VX_TYPE_OBJECT_ARRAY);
+
+    VX_CALL(vxQueryObjectArray(delayobjarray, VX_OBJECT_ARRAY_ITEMTYPE, &expect_type, sizeof(expect_type)));
+    ASSERT_EQ_INT(item_type, expect_type);
+
+    VX_CALL(vxQueryObjectArray(delayobjarray, VX_OBJECT_ARRAY_NUMITEMS, &expect_num_items, sizeof(expect_num_items)));
+    ASSERT_EQ_INT(num_items, expect_num_items);
+
+    for (i = 0u; i < num_items; i++)
+    {
+        ASSERT_VX_OBJECT(expect_item = vxGetObjectArrayItem(delayobjarray, i), (enum vx_type_e)item_type);
+
+        ASSERT_NO_FAILURE(own_check_meta(expect_item, exemplar));
+
+        VX_CALL(vxReleaseReference(&expect_item));
+        ASSERT(expect_item == 0);
+    }
+
+    expect_item = vxGetObjectArrayItem(delayobjarray, (vx_uint32)num_items);
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, vxGetStatus((vx_reference)expect_item));
+
+    VX_CALL(vxReleaseReference(&exemplar));
+    ASSERT(exemplar == 0);
+
+    VX_CALL(vxReleaseObjectArray(&object_array));
+    ASSERT(object_array == 0);
+
+    VX_CALL(vxReleaseDelay(&delay));
+    ASSERT(delay == 0);
+}
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
+#ifdef OPENVX_USE_ENHANCED_VISION
+
+/* *****************testTensor tests*******************************/
+TESTCASE(GraphDelayTensor, CT_VXContext, ct_setup_vx_context, 0)
+
+typedef struct
+{
+    const char *name;
+    enum TestTensorDF fmt;
+} test_tensor_op_arg;
+
+TEST_WITH_ARG(GraphDelayTensor, testTensor, test_tensor_op_arg,
+    ARG("Q78_DELAYTENSOR", TT_Q78),
+    ARG("U8_DELAYTENSOR", TT_U8),
+    ARG("S8_DELAYTENSOR", TT_S8))
+{
+    vx_context context = context_->vx_context_;
+    const enum TestTensorDF fmt = arg_->fmt;
+    vx_size max_dims = 0;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    vx_delay delay;
+    vx_status status;
+    vx_size delaytensor_dims;
+    vx_enum delaytensor_datatype;
+    vx_uint8 delaytensor_fppos;
+    vx_size delaytensor_in0dims[MAX_TENSOR_DIMS];
+
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+    ASSERT(max_dims > 3);
+
+    size_t * const in0_dims = ct_alloc_mem(sizeof(*in0_dims) * max_dims);
+    ASSERT(in0_dims);
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        const size_t new_dim = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+
+        const int mask0 = !!CT_RNG_NEXT_INT(rng, 0, TEST_TENSOR_INVERSE_MASK_PROBABILITY);
+
+        // Note: Broadcasting is described as for each dim, either in0 and in1 have the same
+        // size or "1" for a broadcasted value. And the output is strictly determined by them
+        // so that the implementation is required to support
+        // { in0, in1, out } = { 1, 5, 5 } but not { in0, in1, out } = { 1, 1, 5 }
+        // even though the KHR sample implementation currently supports both.
+        in0_dims[i] = mask0 ? new_dim : 1;
+    }
+
+    vx_tensor tensor = vxCreateTensor(context, max_dims, in0_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(tensor, VX_TYPE_TENSOR);
+
+    ASSERT_VX_OBJECT(delay = vxCreateDelay(context, (vx_reference)tensor, 1), VX_TYPE_DELAY);
+
+    vx_tensor delaytensor;
+    ASSERT_VX_OBJECT(delaytensor = (vx_tensor)vxGetReferenceFromDelay(delay, 0), VX_TYPE_TENSOR);
+
+    status = vxQueryTensor(delaytensor, VX_TENSOR_NUMBER_OF_DIMS, (void *)&delaytensor_dims, sizeof(delaytensor_dims));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, status);
+    EXPECT_EQ_INT(max_dims, delaytensor_dims);
+
+    status = vxQueryTensor(delaytensor, VX_TENSOR_DATA_TYPE, (void *)&delaytensor_datatype, sizeof(delaytensor_datatype));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, status);
+    EXPECT_EQ_INT(data_type, delaytensor_datatype);
+
+    status = vxQueryTensor(delaytensor, VX_TENSOR_FIXED_POINT_POSITION, (void *)&delaytensor_fppos, sizeof(delaytensor_fppos));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, status);
+    EXPECT_EQ_INT(max_dims, delaytensor_dims);
+
+    status = vxQueryTensor(delaytensor, VX_TENSOR_DIMS, (void *)&delaytensor_in0dims, sizeof(vx_size)*max_dims);
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, status);
+
+    for (vx_size i = 0; i < max_dims; i++)
+    {
+        EXPECT_EQ_INT(in0_dims[i], delaytensor_in0dims[i]);
+    }
+
+    VX_CALL(vxReleaseDelay(&delay));
+    VX_CALL(vxReleaseTensor(&tensor));
+
+    ASSERT(delay == 0);
+    ASSERT(tensor == 0);
+
+    ct_free_mem(in0_dims);
+}
+
+#endif //OPENVX_USE_ENHANCED_VISION
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 TESTCASE_TESTS(
     GraphDelay,
     testSimple,
     testPyramid,
-    testRegisterAutoAging
+    testRegisterAutoAging,
+    testObjectArray
     )
+
+#endif
+
+#ifdef OPENVX_USE_ENHANCED_VISION
+
+TESTCASE_TESTS(
+    GraphDelayTensor,
+    testTensor
+    )
+#endif
diff --git a/test_conformance/test_graph_pipeline.c b/test_conformance/test_graph_pipeline.c
new file mode 100644
index 0000000..dc8b865
--- /dev/null
+++ b/test_conformance/test_graph_pipeline.c
@@ -0,0 +1,3537 @@
+/*
+ * Copyright (c) 2012-2018 The Khronos Group Inc.
+ *
+ * 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.
+ */
+
+#ifdef OPENVX_USE_PIPELINING
+
+#include "test_engine/test.h"
+#include <VX/vx.h>
+#include <VX/vx_khr_pipelining.h>
+#include "math.h"
+#include <limits.h>
+
+TESTCASE(GraphPipeline,  CT_VXContext, ct_setup_vx_context, 0)
+
+#define MAX_NUM_BUF               (8u)
+#define MAX_IMAGE_PLANES          (3u)
+#define MAX_NUM_OBJ_ARR_ELEMENTS  (4u)
+#define GRAPH_MAX_DATA_REF_QUEUE  (16u)
+#define DATA_REF_Q_MAX_OBJECTS    (64u)
+
+#define GRAPH_CONSUMED_EVENT      (1u)
+#define NODE0_COMPLETED_EVENT     (2u)
+#define NODE1_COMPLETED_EVENT     (3u)
+#define GRAPH_COMPLETED_EVENT     (4u)
+
+typedef struct {
+    const char* testName;
+    int width, height;
+    int num_buf;
+    int loop_count;
+} Arg;
+
+#define ADD_BUF_1(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/buf=1", __VA_ARGS__, 1))
+
+#define ADD_BUF_2(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/buf=2", __VA_ARGS__, 2))
+
+#define ADD_BUF_3(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/buf=3", __VA_ARGS__, 3))
+
+#define ADD_LOOP_0(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/loop_count=0", __VA_ARGS__, 0))
+
+#define ADD_LOOP_1(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/loop_count=1", __VA_ARGS__, 1))
+
+#define ADD_LOOP_10(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/loop_count=10", __VA_ARGS__, 10))
+
+#define ADD_LOOP_1000(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/loop_count=1000", __VA_ARGS__, 1000))
+
+#define ADD_LOOP_100000(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/loop_count=100000", __VA_ARGS__, 100000))
+
+#define ADD_LOOP_1000000(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/loop_count=1000000", __VA_ARGS__, 1000000))
+
+#define ADD_SIZE_2048x1024(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/sz=2048x1024", __VA_ARGS__, 2048, 1024))
+
+#define PARAMETERS \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_3, ADD_LOOP_0, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_1, ADD_LOOP_0, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_3, ADD_LOOP_1, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_3, ADD_LOOP_1000, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_3, ADD_LOOP_1000, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_1, ADD_LOOP_1000, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_2, ADD_LOOP_1000, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_64x64, ADD_BUF_2, ADD_LOOP_100000, ARG), \
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_2048x1024, ADD_BUF_3, ADD_LOOP_1000, ARG), \
+
+
+/*
+ * Utility API used to add a graph parameter from a node, node parameter index
+ */
+static void add_graph_parameter_by_node_index(vx_graph graph, vx_node node, vx_uint32 node_parameter_index)
+{
+    vx_parameter parameter = vxGetParameterByIndex(node, node_parameter_index);
+
+    vxAddParameterToGraph(graph, parameter);
+    vxReleaseParameter(&parameter);
+}
+
+
+
+static void referenceNot(CT_Image src, CT_Image dst)
+{
+    uint32_t i, j;
+
+    ASSERT(src && dst);
+    ASSERT(src->width == dst->width);
+    ASSERT(src->height == dst->height);
+    ASSERT(src->format == dst->format && src->format == VX_DF_IMAGE_U8);
+
+    for (i = 0; i < dst->height; ++i)
+        for (j = 0; j < dst->width; ++j)
+            dst->data.y[i * dst->stride + j] = ~src->data.y[i * src->stride + j];
+}
+
+static void reference_mean_stddev(CT_Image src, vx_float32* _mean, vx_float32* _stddev)
+{
+    uint32_t x, y, width = src ? src->width : 0, height = src ? src->height : 0;
+    uint32_t npix, stride;
+    double sum = 0, sqsum = 0;
+    int format = src ? src->format : VX_DF_IMAGE_U8;
+
+    ASSERT(src);
+    ASSERT(src->width > 0 && src->height > 0);
+    npix = width*height;
+    stride = ct_stride_bytes(src);
+
+#define CASE_MEANSTDDEV(format, type, acctype) \
+    case format: \
+    { \
+        acctype s = 0, s2 = 0; \
+        for( y = 0; y < src->height; y++ ) \
+        { \
+            const type* ptr = (const type*)(src->data.y + stride*y); \
+            for( x = 0; x < src->width; x++ ) \
+            { \
+                type val = ptr[x]; \
+                s += val; \
+                s2 += (acctype)val*val; \
+            } \
+        } \
+        sum = (double)s; sqsum = (double)s2; \
+    } \
+    break
+
+    switch(format)
+    {
+    CASE_MEANSTDDEV(VX_DF_IMAGE_U8, uint8_t, uint64_t);
+    default:
+        FAIL("Unsupported image format: (%d)", &src->format);
+    }
+
+    *_mean = (vx_float32)(sum/npix);
+    sqsum = sqsum/npix - (sum/npix)*(sum/npix);
+    *_stddev = (vx_float32)sqrt(CT_MAX(sqsum, 0.));
+}
+
+static void fillSequence(CT_Image dst, uint32_t seq_init)
+{
+    uint32_t i, j;
+    uint32_t val = seq_init;
+
+    ASSERT(dst);
+    ASSERT(dst->format == VX_DF_IMAGE_U8);
+
+    for (i = 0; i < dst->height; ++i)
+        for (j = 0; j < dst->width; ++j)
+            dst->data.y[i * dst->stride + j] = val;
+}
+
+#define TEST_USER_KERNEL_NAME          "test_graph_pipeline.user_kernel"
+#define TEST_USER_KERNEL_NUM_PARAMS     (4u)
+static vx_kernel test_user_kernel = NULL;
+
+static vx_status test_user_kernel_validate(vx_node node,
+            const vx_reference parameters[ ],
+            vx_uint32 num,
+            vx_meta_format metas[])
+{
+    vx_status status = VX_SUCCESS;
+    vx_scalar scalar[TEST_USER_KERNEL_NUM_PARAMS];
+    vx_enum scalar_type[TEST_USER_KERNEL_NUM_PARAMS];
+    vx_uint32 i;
+
+    if (num != TEST_USER_KERNEL_NUM_PARAMS)
+    {
+        printf(" ERROR: Test user kernel: Number of parameters dont match !!!\n");
+        status = VX_ERROR_INVALID_PARAMETERS;
+    }
+
+    for (i = 0U; i < TEST_USER_KERNEL_NUM_PARAMS; i ++)
+    {
+        scalar[i] = (vx_scalar)parameters[i];
+
+        if(scalar[i] != NULL)
+        {
+            /* i.e not a optional parameter */
+            status = vxQueryScalar(scalar[i],
+                VX_SCALAR_TYPE, &scalar_type[i],
+                sizeof(vx_enum));
+            if(status==VX_SUCCESS)
+            {
+                if(scalar_type[i] != VX_TYPE_UINT32)
+                {
+                    printf(" ERROR: Test user kernel: Scalar type MUST be VX_TYPE_UINT32 !!!\n");
+                    status = VX_ERROR_INVALID_PARAMETERS;
+                }
+                vxSetMetaFormatAttribute(metas[i], VX_SCALAR_TYPE, &scalar_type[i],
+                    sizeof(scalar_type[i]));
+            }
+            if(status!=VX_SUCCESS)
+            {
+                printf(" ERROR: Test user kernel: validate failed !!!\n");
+                break;
+            }
+        }
+    }
+
+    return status;
+}
+
+static vx_status test_user_kernel_run(vx_node node,
+            const vx_reference parameters[ ],
+            vx_uint32 num)
+{
+    vx_status status = VX_SUCCESS;
+    vx_scalar in1, in2, out1, out2;
+    vx_uint32 in1_value = 0, in2_value = 0;
+    vx_uint32 out1_value = 0, out2_value = 0;
+
+    /* Any of the parameter can be NULL since parameter is marked
+     * as optional during kernel register */
+    in1  = (vx_scalar)parameters[0];
+    in2  = (vx_scalar)parameters[1];
+    out1 = (vx_scalar)parameters[2];
+    out2 = (vx_scalar)parameters[3];
+
+    if(in1!=NULL)
+    {
+        vxCopyScalar(in1,
+            &in1_value,
+            VX_READ_ONLY,
+            VX_MEMORY_TYPE_HOST
+            );
+    }
+    if(in2!=NULL)
+    {
+        vxCopyScalar(in2,
+            &in2_value,
+            VX_READ_ONLY,
+            VX_MEMORY_TYPE_HOST
+            );
+    }
+
+    /* just for test
+     * out1_value = in1_value + in2_value
+     * out2_value = out1_value * 2
+     * when in1 reference is not specified (since its optional), in1_value is considered to be 0
+     * when in2 reference is not specified (since its optional), in2_value is considered to be 0
+     */
+    out1_value = in1_value + in2_value;
+    out2_value = out1_value*2;
+
+    if(out1!=NULL)
+    {
+        vxCopyScalar(out1,
+            &out1_value,
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST
+            );
+    }
+    if(out2!=NULL)
+    {
+        vxCopyScalar(out2,
+            &out2_value,
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST
+            );
+    }
+
+    return status;
+}
+
+static vx_status test_user_kernel_register(vx_context context)
+{
+    vx_kernel kernel = NULL;
+    vx_status status;
+    uint32_t index;
+    vx_enum test_user_kernel_id = 0;
+
+    status = vxAllocateUserKernelId(context, &test_user_kernel_id);
+    if(status!=VX_SUCCESS)
+    {
+        printf(" ERROR: Test user kernel: vxAllocateUserKernelId failed (%d)!!!\n", status);
+    }
+    if(status==VX_SUCCESS)
+    {
+        kernel = vxAddUserKernel(
+                    context,
+                    TEST_USER_KERNEL_NAME,
+                    test_user_kernel_id,
+                    test_user_kernel_run,
+                    TEST_USER_KERNEL_NUM_PARAMS, /* number of parameters objects for this user function */
+                    test_user_kernel_validate,
+                    NULL,
+                    NULL);
+    }
+
+    status = vxGetStatus((vx_reference)kernel);
+    if ( status == VX_SUCCESS)
+    {
+        index = 0;
+
+        if ( status == VX_SUCCESS)
+        {
+            status = vxAddParameterToKernel(kernel,
+                index,
+                VX_INPUT,
+                VX_TYPE_SCALAR,
+                VX_PARAMETER_STATE_OPTIONAL
+                );
+            index++;
+        }
+        if ( status == VX_SUCCESS)
+        {
+            status = vxAddParameterToKernel(kernel,
+                index,
+                VX_INPUT,
+                VX_TYPE_SCALAR,
+                VX_PARAMETER_STATE_OPTIONAL
+                );
+            index++;
+        }
+        if ( status == VX_SUCCESS)
+        {
+            status = vxAddParameterToKernel(kernel,
+                index,
+                VX_OUTPUT,
+                VX_TYPE_SCALAR,
+                VX_PARAMETER_STATE_OPTIONAL
+                );
+            index++;
+        }
+        if ( status == VX_SUCCESS)
+        {
+            status = vxAddParameterToKernel(kernel,
+                index,
+                VX_OUTPUT,
+                VX_TYPE_SCALAR,
+                VX_PARAMETER_STATE_OPTIONAL
+                );
+            index++;
+        }
+        if ( status == VX_SUCCESS)
+        {
+            status = vxFinalizeKernel(kernel);
+        }
+        if( status != VX_SUCCESS)
+        {
+            printf(" ERROR: Test user kernel: vxAddParameterToKernel, vxFinalizeKernel failed (%d)!!!\n", status);
+            vxReleaseKernel(&kernel);
+            kernel = NULL;
+        }
+    }
+    else
+    {
+        kernel = NULL;
+        printf(" ERROR: Test user kernel: vxAddUserKernel failed (%d)!!!\n", status);
+    }
+    if(status==VX_SUCCESS)
+    {
+        test_user_kernel = kernel;
+    }
+
+    return status;
+}
+
+static vx_status test_user_kernel_unregister(vx_context context)
+{
+    vx_status status;
+
+    status = vxRemoveKernel(test_user_kernel);
+    test_user_kernel = NULL;
+
+    if(status!=VX_SUCCESS)
+    {
+        printf(" ERROR: Test user kernel: Unable to remove kernel (%d)!!!\n", status);
+    }
+
+    return status;
+}
+
+static vx_node test_user_kernel_node(vx_graph graph,
+            vx_scalar in1,
+            vx_scalar in2,
+            vx_scalar out1,
+            vx_scalar out2)
+{
+    vx_node node = 0;
+
+    vx_context context = vxGetContext((vx_reference)graph);
+
+    vx_kernel kernel = vxGetKernelByName(context, TEST_USER_KERNEL_NAME);
+
+    if(kernel!=NULL)
+    {
+        /* kernel is released inside vxCreateNodeByStructure */
+        //ASSERT_VX_OBJECT(node =  vxCreateNodeByStructure(graph, kernel, 0, refs, sizeof(refs)/sizeof(refs[0])), VX_TYPE_NODE);
+        node = vxCreateGenericNode(graph, kernel);
+
+        if (NULL != in1)
+        {
+            vxSetParameterByIndex(node, 0, (vx_reference)in1);
+        }
+
+        if (NULL != in2)
+        {
+            vxSetParameterByIndex(node, 1, (vx_reference)in2);
+        }
+
+        if (NULL != out1)
+        {
+            vxSetParameterByIndex(node, 2, (vx_reference)out1);
+        }
+
+        if (NULL != out2)
+        {
+            vxSetParameterByIndex(node, 3, (vx_reference)out2);
+        }
+
+        vxReleaseKernel(&kernel);
+    }
+
+    return node;
+}
+
+/*
+ *  d0      n0     d2
+ *  IMG --  OR -- IMG (*)
+ *  (*)     |
+ *          d1 (single ref)
+ *
+ * (*) = queueing enabled
+ *
+ * This test case test the below
+ * - A data reference on which queing is not enabled
+ * - No looping
+ * - fixed pipeline depth of 2
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testOneNode, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d1, d2[MAX_NUM_BUF];
+    vx_node n0;
+
+    CT_Image ref_src[MAX_NUM_BUF], vxdst;
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    loop_cnt = arg_->loop_count;
+    num_buf = 2;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    /* create other refs, these are not multiple refs and same refs is fed as parameter to the graph */
+    ASSERT_VX_OBJECT(d1    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    /* fill d1 with zero's so that OR operation acts like a NOP */
+    {
+        vx_imagepatch_addressing_t addr;
+        vx_rectangle_t rect;
+        void *ptr;
+        vx_map_id map_id;
+
+        rect.start_x = rect.start_y = 0;
+        rect.end_x = width;
+        rect.end_y = height;
+
+        VX_CALL(vxMapImagePatch(d1, &rect, 0, &map_id, &addr, &ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X));
+
+        ct_memset(ptr, 0x0, addr.stride_y*addr.dim_y);
+
+        VX_CALL(vxUnmapImagePatch(d1, map_id));
+    }
+
+    /* create node, input (index 0) and output (index 2) will be made as graph parameter
+     * so that we can enqueue and dequeue refs to it and thus do graph pipelining.
+     * d0[0], d2[0] used only for their meta data.
+     * Actual input and output used for graph processing will be the
+     * refs that are enqueued later
+     */
+    ASSERT_VX_OBJECT(n0    = vxOrNode(graph, d0[0], d1, d2[0]), VX_TYPE_NODE);
+
+    /* input @ node index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ node index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n0, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0 and 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+			VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+			2,
+			graph_parameters_queue_params_list
+			));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image out_img, in_img;
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_img, 1, &num_refs));
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+
+        /* when measuring performance dont check output since it affects graph performance numbers
+         */
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        ASSERT_NO_FAILURE({
+            vxdst = ct_image_from_vx_image(out_img);
+        });
+
+        /* compare output */
+        ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_img, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&d1));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *  d0     n0     d1     n1     d2
+ * IMG -- NOT -- IMG -- NOT -- IMG
+ *
+ * This test case test the below
+ * - Single input, single output nodes
+ * - Two nodes on two different targets
+ * - Number of buffers = pipeline depth
+ * - Virtual objects, no hints provided except for pipeline depth
+ * - fixed pipeline depth of 2
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testTwoNodesBasic, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d1, d2[MAX_NUM_BUF];
+    vx_node n0, n1;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+
+    CT_Image ref_src[MAX_NUM_BUF], vxdst;
+    uint32_t width, height, seq_init;
+    uint32_t buf_id, loop_id, loop_cnt, num_buf;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    loop_cnt = arg_->loop_count;
+    num_buf = 2;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    ASSERT_VX_OBJECT(d1    = vxCreateVirtualImage(graph, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(n0    = vxNotNode(graph, d0[0], d1), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = vxNotNode(graph, d1, d2[0]), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n1 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n1, 1);
+
+    /* set graph schedule config such that graph parameter @ index 0 and 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+			VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+			2,
+			graph_parameters_queue_params_list
+			));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image out_img, in_img;
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        ASSERT_NO_FAILURE({
+            vxdst = ct_image_from_vx_image(out_img);
+        });
+
+        /* compare output */
+        ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1);
+            vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_img, 1);
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&d1));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *  d0     n0     d1     n1     d2
+ * IMG -- NOT -- IMG -- NOT -- IMG
+ *
+ * This test case test the below
+ * - Single input, single output nodes
+ * - Two nodes on two different targets
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testTwoNodes, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d1[MAX_NUM_BUF], d2[MAX_NUM_BUF];
+    vx_node n0, n1;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[3];
+
+    CT_Image ref_src[MAX_NUM_BUF], vxdst;
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d1[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    ASSERT_VX_OBJECT(n0    = vxNotNode(graph, d0[0], d1[0]), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = vxNotNode(graph, d1[0], d2[0]), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* intermediate output @ n0 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n0, 1);
+    /* output @ n1 index 1, becomes graph parameter 2 */
+    add_graph_parameter_by_node_index(graph, n1, 1);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1, 2 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d1[0];
+
+    graph_parameters_queue_params_list[2].graph_parameter_index = 2;
+    graph_parameters_queue_params_list[2].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[2].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+			VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+			3,
+			graph_parameters_queue_params_list
+			));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d1[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&d2[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image out_img, in_img, intermediate_img;
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 2, (vx_reference*)&out_img, 1, &num_refs));
+
+        /* Get consumed intermediate reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&intermediate_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+
+        /* when measuring performance dont check output since it affects graph performance numbers
+         */
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        ASSERT_NO_FAILURE({
+            vxdst = ct_image_from_vx_image(out_img);
+        });
+
+        /* compare output */
+        ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&intermediate_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&out_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d1[buf_id]));
+        VX_CALL(vxReleaseImage(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *  d0     n0     d1     n1     d2    n2     d3     n3      d5
+ * IMG -- NOT -- IMG -- NOT -- IMG -- OR  -- IMG -- AND -- IMG
+ *                |                   |              |
+ *                +-------------------+             IMG
+ *                                                   d4
+ *
+ * This test case test the below
+ * - Same input going to multiple nodes
+ * - Outputs from multiple nodes going to a single node
+ * - Node taking input from another node as well as from user
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testFourNodes, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d1, d2, d3, d4[MAX_NUM_BUF], d5[MAX_NUM_BUF];
+    vx_node  n0, n1, n2, n3;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[3];
+
+    CT_Image ref_src[MAX_NUM_BUF], vxdst;
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d4[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d5[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    ASSERT_VX_OBJECT(d1    = vxCreateVirtualImage(graph, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(d2    = vxCreateVirtualImage(graph, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(d3    = vxCreateVirtualImage(graph, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(n0    = vxNotNode(graph, d0[0], d1), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = vxNotNode(graph, d1, d2), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n2    = vxOrNode(graph, d1, d2, d3), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n3    = vxAndNode(graph, d3, d4[0], d5[0]), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* input @ n3 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n3, 1);
+    /* output @ n3 index 2, becomes graph parameter 2 */
+    add_graph_parameter_by_node_index(graph, n3, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1, 2 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d4[0];
+
+    graph_parameters_queue_params_list[2].graph_parameter_index = 2;
+    graph_parameters_queue_params_list[2].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[2].refs_list = (vx_reference*)&d5[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+			VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+			3,
+			graph_parameters_queue_params_list
+			));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d4[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d4[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&d5[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image out_img, in1_img, in2_img;
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 2, (vx_reference*)&out_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&in2_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in1_img, 1, &num_refs));
+
+        /* when measuring performance dont check output since it affects graph performance numbers
+         */
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        ASSERT_NO_FAILURE({
+            vxdst = ct_image_from_vx_image(out_img);
+        });
+
+        /* compare output */
+        ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in1_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&in2_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&out_img, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    VX_CALL(vxReleaseNode(&n2));
+    VX_CALL(vxReleaseNode(&n3));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d4[buf_id]));
+        VX_CALL(vxReleaseImage(&d5[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&d1));
+    VX_CALL(vxReleaseImage(&d2));
+    VX_CALL(vxReleaseImage(&d3));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *  d0     n0     d1
+ * IMG -- NOT -- IMG -- NOT --, etc. for GRAPH_MAX_DATA_REF_QUEUE length
+ *
+ *
+ * This test case test the below
+ * - Tests the limit of GRAPH_MAX_DATA_REF_QUEUE
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testMaxDataRef, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d_virt[GRAPH_MAX_DATA_REF_QUEUE], d1[MAX_NUM_BUF];
+    vx_node  n[GRAPH_MAX_DATA_REF_QUEUE+1];
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+
+    CT_Image ref_src[MAX_NUM_BUF];
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt, i;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d1[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    for (i = 0; i < GRAPH_MAX_DATA_REF_QUEUE; i++)
+    {
+        ASSERT_VX_OBJECT(d_virt[i]    = vxCreateVirtualImage(graph, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+
+    ASSERT_VX_OBJECT(n[0]    = vxNotNode(graph, d0[0], d_virt[0]), VX_TYPE_NODE);
+
+    for (i = 0; i < GRAPH_MAX_DATA_REF_QUEUE-1; i++)
+    {
+        ASSERT_VX_OBJECT(n[i+1]    = vxNotNode(graph, d_virt[i], d_virt[i+1]), VX_TYPE_NODE);
+    }
+    ASSERT_VX_OBJECT(n[GRAPH_MAX_DATA_REF_QUEUE]    = vxNotNode(graph, d_virt[GRAPH_MAX_DATA_REF_QUEUE-1], d1[0]), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n[0], 0);
+    /* input @ n3 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n[GRAPH_MAX_DATA_REF_QUEUE], 1);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1, 2 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d1[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+			VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+			2,
+			graph_parameters_queue_params_list
+			));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d1[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d1[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image out_img, in_img;
+        uint32_t num_refs;
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_img, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    for (i = 0; i < GRAPH_MAX_DATA_REF_QUEUE+1; i++)
+    {
+        VX_CALL(vxReleaseNode(&n[i]));
+    }
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d1[buf_id]));
+    }
+    for (i = 0; i < GRAPH_MAX_DATA_REF_QUEUE; i++)
+    {
+        VX_CALL(vxReleaseImage(&d_virt[i]));
+    }
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *  d0      n0      d2
+ *  IMG --  AND -- IMG
+ *          |
+ *          d1 (uniform image) filled with 0xFF
+ *
+ * This test case test the below
+ * - Uniform image as input
+ * - No looping
+ * - fixed pipeline depth of 2
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testUniformImage, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d1, d2[MAX_NUM_BUF];
+    vx_node n0;
+    vx_pixel_value_t pixel_value;
+
+    CT_Image ref_src[MAX_NUM_BUF], vxdst;
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    loop_cnt = arg_->loop_count;
+    num_buf = 2;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    /* create other refs, these are not multiple refs and same refs is fed as parameter to the graph */
+    pixel_value.U8 = 0xFF;
+    ASSERT_VX_OBJECT(d1    = vxCreateUniformImage(context, width, height, VX_DF_IMAGE_U8, &pixel_value), VX_TYPE_IMAGE);
+
+
+    /* create node, input (index 0) and output (index 2) will be made as graph parameter
+     * so that we can enqueue and dequeue refs to it and thus do graph pipelining.
+     * d0[0], d2[0] used only for their meta data.
+     * Actual input and output used for graph processing will be the
+     * refs that are enqueued later.
+     *
+     * d1 also made a graph parameter, however it wont made as enqueable.
+     */
+    ASSERT_VX_OBJECT(n0    = vxAndNode(graph, d0[0], d1, d2[0]), VX_TYPE_NODE);
+
+    /* input @ node index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ node index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n0, 2);
+    /* input @ node index 1, becomes graph parameter 3 */
+    add_graph_parameter_by_node_index(graph, n0, 1);
+
+    /* set graph schedule config such that graph parameter @ index 0 and 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+			VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+			2,
+			graph_parameters_queue_params_list
+			));
+
+    /* This graph parameter @ index 2 is not enqueue-able */
+    VX_CALL(vxSetGraphParameterByIndex(graph, 2, (vx_reference)d1));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image out_img, in_img;
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+
+        /* when measuring performance dont check output since it affects graph performance numbers
+         */
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        ASSERT_NO_FAILURE({
+            vxdst = ct_image_from_vx_image(out_img);
+        });
+
+        /* compare output */
+        ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_img, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&d1));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+static inline uint32_t get_ref_src_index(uint32_t num_buf, uint32_t objarr_idx, uint32_t buf_id)
+{
+    return (objarr_idx*num_buf + buf_id);
+}
+
+static inline vx_object_array get_object_array_parent_of_image(vx_image out_img,
+                vx_object_array d2[], vx_image img[], vx_uint32 num_buf)
+{
+    vx_object_array objarr = NULL;
+    vx_uint32 buf_id;
+
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        if(out_img==img[buf_id])
+        {
+            objarr = d2[buf_id];
+            break;
+        }
+    }
+    return objarr;
+}
+
+
+/*
+ *  d0     n0     d1     n1     d2
+ * OBJ -- NOT -- OBJ -- NOT -- OBJ
+ * ARR           ARR           ARR
+ * replicate     replicate     replicate
+ *
+ * This test case test the below
+ * - Object array with replciate attribute set
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testReplicateImage, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_object_array d0[MAX_NUM_BUF], d1, d2[MAX_NUM_BUF];
+    vx_image img0[MAX_NUM_BUF], img1, img2[MAX_NUM_BUF];
+    vx_image img_exemplar;
+    vx_node n0, n1;
+    vx_bool replicate[2] = { vx_true_e, vx_true_e };
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+
+    CT_Image ref_src[MAX_NUM_BUF*MAX_NUM_OBJ_ARR_ELEMENTS], vxdst[MAX_NUM_OBJ_ARR_ELEMENTS];
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+    uint32_t idx, objarr_idx, objarr_elements;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+    objarr_elements = 2;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+    ASSERT(objarr_elements <= MAX_NUM_OBJ_ARR_ELEMENTS);
+
+    /* fill reference data */
+    for(objarr_idx=0;objarr_idx<objarr_elements;objarr_idx++)
+    {
+        for(buf_id=0; buf_id<num_buf; buf_id++)
+        {
+            idx = get_ref_src_index(num_buf, objarr_idx, buf_id);
+
+            ASSERT_NO_FAILURE({
+                ref_src[idx] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+                fillSequence(ref_src[idx], (uint32_t)(seq_init+(idx)));
+            });
+        }
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    ASSERT_VX_OBJECT(img_exemplar    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateObjectArray(context, (vx_reference)img_exemplar, objarr_elements), VX_TYPE_OBJECT_ARRAY);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateObjectArray(context, (vx_reference)img_exemplar, objarr_elements), VX_TYPE_OBJECT_ARRAY);
+    }
+    ASSERT_VX_OBJECT(d1    = vxCreateObjectArray(context, (vx_reference)img_exemplar, objarr_elements), VX_TYPE_OBJECT_ARRAY);
+
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        img0[buf_id] = (vx_image)vxGetObjectArrayItem(d0[buf_id], 0);
+        img2[buf_id] = (vx_image)vxGetObjectArrayItem(d2[buf_id], 0);
+    }
+    img1 = (vx_image)vxGetObjectArrayItem(d1, 0);
+
+    ASSERT_VX_OBJECT(n0    = vxNotNode(graph, img0[0], img1), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = vxNotNode(graph, img1, img2[0]), VX_TYPE_NODE);
+
+    VX_CALL(vxReplicateNode(graph, n0, replicate, 2));
+    VX_CALL(vxReplicateNode(graph, n1, replicate, 2));
+
+    /* input @ node0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ node1 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n1, 1);
+
+    /* set graph schedule config such that graph parameter @ index 0 and 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&img0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&img2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+			VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+			2,
+			graph_parameters_queue_params_list
+			));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        for(objarr_idx=0;objarr_idx<objarr_elements;objarr_idx++)
+        {
+            vx_image image;
+
+            idx = get_ref_src_index(num_buf, objarr_idx, buf_id);
+
+            image = (vx_image)vxGetObjectArrayItem(d0[buf_id], objarr_idx);
+
+            ASSERT_NO_FAILURE(ct_image_copyto_vx_image(image, ref_src[idx]));
+
+            VX_CALL(vxReleaseImage(&image));
+        }
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        vx_image image;
+
+        image = (vx_image)vxGetObjectArrayItem(d0[buf_id], 0);
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&image, 1));
+        vxReleaseImage(&image);
+
+        image = (vx_image)vxGetObjectArrayItem(d2[buf_id], 0);
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&image, 1));
+        vxReleaseImage(&image);
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image out_img, in_img;
+        vx_object_array out_objarr;
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        out_objarr = get_object_array_parent_of_image(out_img, d2, img2, num_buf);
+
+        for(objarr_idx=0;objarr_idx<objarr_elements;objarr_idx++)
+        {
+            vx_image image;
+
+            image = (vx_image)vxGetObjectArrayItem(out_objarr, objarr_idx);
+
+            ASSERT_NO_FAILURE({
+                vxdst[objarr_idx] = ct_image_from_vx_image(image);
+            });
+
+            VX_CALL(vxReleaseImage(&image));
+        }
+
+        for(objarr_idx=0;objarr_idx<objarr_elements;objarr_idx++)
+        {
+            idx = get_ref_src_index(num_buf, objarr_idx, buf_id);
+
+            /* compare output */
+            /* NOT of NOT should give back original image */
+            ASSERT_EQ_CTIMAGE(ref_src[idx], vxdst[objarr_idx]);
+        }
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_img, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    VX_CALL(vxReleaseImage(&img_exemplar));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&img0[buf_id]));
+        VX_CALL(vxReleaseImage(&img2[buf_id]));
+    }
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseObjectArray(&d0[buf_id]));
+        VX_CALL(vxReleaseObjectArray(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&img1));
+    VX_CALL(vxReleaseObjectArray(&d1));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *
+ * IMAGE -> MeanStdDev -> MEAN (SCALAR)
+ *              |
+ *              +-------> STD_DEV (SCALAR)
+ *
+ * This test case test the below
+ * - Scalar with pipeline with scalar at output
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testScalarOutput, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF];
+    vx_scalar mean_s[MAX_NUM_BUF], stddev_s[MAX_NUM_BUF];
+    vx_node n0;
+    vx_float32 mean_out=0.0, stddev_out=0.0;
+    vx_float32 mean_tolerance=1e-4, stddev_tolerance=1e-4;
+    vx_float32 mean_diff, stddev_diff;
+    CT_Image ref_src[MAX_NUM_BUF];
+    vx_float32 mean_ref[MAX_NUM_BUF];
+    vx_float32 stddev_ref[MAX_NUM_BUF];
+    uint32_t width, height, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+    uint64_t rng;
+    int a = 0, b = 256;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[3];
+
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    rng = CT()->seed_;
+    mean_tolerance *= b;
+    stddev_tolerance *= b;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &rng, a, b);
+        });
+        reference_mean_stddev(ref_src[buf_id], &mean_ref[buf_id], &stddev_ref[buf_id]);
+        //printf("Ref %d: mean=%5.3f, stddev=%5.3f\n", buf_id, (float)mean_ref[buf_id], (float)stddev_ref[buf_id]);
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]       = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(mean_s[buf_id]   = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean_out), VX_TYPE_SCALAR);
+        ASSERT_VX_OBJECT(stddev_s[buf_id] = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev_out), VX_TYPE_SCALAR);
+    }
+    ASSERT_VX_OBJECT(n0    = vxMeanStdDevNode(graph, d0[0], mean_s[0], stddev_s[0]), VX_TYPE_NODE);
+
+    /* input @ node0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ node0 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n0, 1);
+    /* output @ node0 index 2, becomes graph parameter 2 */
+    add_graph_parameter_by_node_index(graph, n0, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0 and 1 and 2 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&mean_s[0];
+
+    graph_parameters_queue_params_list[2].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[2].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[2].refs_list = (vx_reference*)&stddev_s[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            3,
+            graph_parameters_queue_params_list
+            ));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&mean_s[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&stddev_s[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image in_img;
+        vx_scalar out_mean, out_stddev;
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 2, (vx_reference*)&out_stddev, 1, &num_refs));
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_mean, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+
+        /* when measuring performance dont check output since it affects graph performance numbers
+         */
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        VX_CALL(vxCopyScalar(out_mean, &mean_out, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+        VX_CALL(vxCopyScalar(out_stddev, &stddev_out, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+        /* compare output with reference */
+        mean_diff = fabs(mean_ref[buf_id] - mean_out);
+        stddev_diff = fabs(stddev_ref[buf_id] - stddev_out);
+
+        //printf("Out %d: mean=%5.3f, stddev=%5.3f\n", loop_id, (float)mean_out, (float)stddev_out);
+
+        #if 1
+        if( mean_diff > mean_tolerance ||
+            stddev_diff > stddev_tolerance )
+        {
+            CT_RecordFailureAtFormat("Test case %d. width=%d, height=%d,\n"
+                                     "\tExpected: mean=%.5g, stddev=%.5g\n"
+                                     "\tActual:   mean=%.5g (diff=%.5g %s %.5g), stddev=%.5f (diff=%.5g %s %.5g)\n",
+                                     __FUNCTION__, __FILE__, __LINE__,
+                                     loop_id, width, height,
+                                     mean_ref[buf_id], stddev_ref[buf_id],
+                                     mean_out, mean_diff, mean_diff > mean_tolerance ? ">" : "<=", mean_tolerance,
+                                     stddev_out, stddev_diff, stddev_diff > stddev_tolerance ? ">" : "<=", stddev_tolerance);
+        }
+        #endif
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_mean, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&out_stddev, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+    VX_CALL(vxReleaseNode(&n0));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseScalar(&mean_s[buf_id]));
+        VX_CALL(vxReleaseScalar(&stddev_s[buf_id]));
+    }
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *  d0     n0     d1     n1     d2
+ * IMG -- NOT -- IMG -- NOT -- IMG
+ *
+ * This test case test the below
+ * - Single input, single output nodes
+ * - Two nodes on two different targets
+ * - Events are used to enqueue/dequeue buffers
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testEventHandling, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d1, d2[MAX_NUM_BUF];
+    vx_node n0, n1;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+
+    CT_Image ref_src[MAX_NUM_BUF], vxdst;
+    uint32_t width, height, seq_init, num_buf, loop_cnt;
+    uint32_t buf_id, loop_id, in_q_cnt;
+
+    vx_bool done;
+    vx_event_t event;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    VX_CALL(vxEnableEvents(context));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id] = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d2[buf_id] = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    ASSERT_VX_OBJECT(d1    = vxCreateVirtualImage(graph, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(n0    = vxNotNode(graph, d0[0], d1), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = vxNotNode(graph, d1, d2[0]), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n1 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n1, 1);
+
+    /* set graph schedule config such that graph parameter @ index 0 and 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            2,
+            graph_parameters_queue_params_list
+            ));
+
+    VX_CALL(vxRegisterEvent((vx_reference)graph, VX_EVENT_GRAPH_PARAMETER_CONSUMED, 0, GRAPH_CONSUMED_EVENT));
+    VX_CALL(vxRegisterEvent((vx_reference)n0, VX_EVENT_NODE_COMPLETED, 0, NODE0_COMPLETED_EVENT));
+    VX_CALL(vxRegisterEvent((vx_reference)n1, VX_EVENT_NODE_COMPLETED, 0, NODE1_COMPLETED_EVENT));
+    VX_CALL(vxRegisterEvent((vx_reference)graph, VX_EVENT_GRAPH_COMPLETED, 0, GRAPH_COMPLETED_EVENT));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* clear pending events */
+    while( vxWaitEvent(context, &event, vx_true_e) == VX_SUCCESS);
+
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    done = vx_false_e;
+    loop_id = 0;
+    in_q_cnt = 0;
+    while(!done)
+    {
+        VX_CALL(vxWaitEvent(context, &event, vx_false_e));
+
+        if(event.app_value==GRAPH_CONSUMED_EVENT)
+        {
+            vx_image in_img;
+            uint32_t num_refs;
+
+            /* input should be free at this point */
+            /* recycle input buffer, input data is not changed in this test */
+            VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &num_refs));
+            if(in_q_cnt<loop_cnt)
+            {
+                VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_img, 1));
+            }
+            in_q_cnt++;
+        }
+        else
+        if(event.app_value==NODE1_COMPLETED_EVENT)
+        {
+            vx_image out_img;
+            uint32_t num_refs;
+
+            /* Get output reference, waits until a reference is available */
+            VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_img, 1, &num_refs));
+
+            /* when measuring performance dont check output since it affects graph performance numbers
+             */
+
+            if(loop_cnt > 100)
+            {
+                ct_update_progress(loop_id, loop_cnt+num_buf);
+            }
+
+            ASSERT_NO_FAILURE({
+                vxdst = ct_image_from_vx_image(out_img);
+            });
+
+            /* compare output */
+            ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+
+            buf_id = (buf_id+1)%num_buf;
+
+            /* recycles dequeued input and output refs 'loop_cnt' times */
+            if(loop_id<loop_cnt)
+            {
+                /* input and output can be enqueued in any order */
+                VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_img, 1));
+            }
+            else
+            {
+                /* send user event to exit, id is 0xDEADBEAF, and parameter is some known pattern 0x12345678 */
+                VX_CALL(vxSendUserEvent(context, 0xDEADBEAFu, (void*)0x12345678u));
+            }
+
+            loop_id++;
+        }
+        else
+        if((event.type==VX_EVENT_USER)
+            && (event.app_value == 0xDEADBEAFu)
+            && (event.event_info.user_event.user_event_parameter == (void*)0x12345678u)
+            )
+        {
+            done = vx_true_e;
+        }
+    }
+
+    VX_CALL(vxWaitGraph(graph));
+
+    /* handle last few buffers */
+    done = vx_false_e;
+    while(!done)
+    {
+        vx_image in_img, out_img;
+        vx_uint32 in_num_refs, out_num_refs;
+
+        /* recycle and access output data */
+        VX_CALL(vxGraphParameterCheckDoneRef(graph, 1, &out_num_refs));
+        if(out_num_refs>0)
+        {
+            VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_img, 1, &out_num_refs));
+
+
+            ASSERT_NO_FAILURE({
+                vxdst = ct_image_from_vx_image(out_img);
+            });
+            /* compare output */
+            /* NOT of NOT should give back original image */
+            ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+        }
+        /* recycle and access input data */
+        VX_CALL(vxGraphParameterCheckDoneRef(graph, 0, &in_num_refs));
+        if(in_num_refs>0)
+        {
+            VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_img, 1, &in_num_refs));
+        }
+        buf_id = (buf_id+1)%num_buf;
+
+        if(in_num_refs == 0 && out_num_refs == 0)
+        {
+            done = vx_true_e;
+        }
+    }
+
+    /* clear pending events */
+    while( vxWaitEvent(context, &event, vx_true_e) == VX_SUCCESS);
+
+    #endif
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&d1));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *
+ * This test case test the below
+ * - Disable of events and reenable of events
+ *
+ */
+TEST(GraphPipeline, testEventHandlingDisableEvents)
+{
+    vx_context context = context_->vx_context_;
+    vx_event_t event;
+
+    VX_CALL(vxEnableEvents(context));
+
+    /* send one user event, this should be received */
+    VX_CALL(vxSendUserEvent(context, 0x1u, NULL));
+
+    /* disable events and send another event */
+    VX_CALL(vxDisableEvents(context));
+    /* this event should get dropped and send event API should return failure */
+    ASSERT(vxSendUserEvent(context, 0x2u, NULL)!=VX_SUCCESS);
+
+    /* re-enable events and send another event */
+    VX_CALL(vxEnableEvents(context));
+    /* this event should get received */
+    VX_CALL(vxSendUserEvent(context, 0x3u, NULL));
+
+    /* wait for one event, this should be the first one */
+    VX_CALL(vxWaitEvent(context, &event, vx_true_e));
+    ASSERT(event.type==VX_EVENT_USER && event.app_value==0x1u);
+
+    /* wait for one more event, this should be the third one */
+    VX_CALL(vxWaitEvent(context, &event, vx_true_e));
+    ASSERT(event.type==VX_EVENT_USER && event.app_value==0x3u);
+
+    /* wait for one more event, there should be no more events */
+    ASSERT(vxWaitEvent(context, &event, vx_true_e) != VX_SUCCESS);
+}
+
+/*
+ *  d0           n0           d1            n1         d2
+ * SCALAR -- USER_KERNEL -- SCALAR -- USER_KERNEL -- SCALAR
+ *                            |            |
+ *                            + -----------+
+ *
+ * This test case test the below
+ * - User kernel nodes
+ * - Nodes with optional parameters
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testUserKernel, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_scalar d0[MAX_NUM_BUF], d1, d2[MAX_NUM_BUF];
+    vx_scalar in_scalar, out_scalar;
+    vx_node n0, n1;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+    vx_uint32 in_value[MAX_NUM_BUF], ref_out_value[MAX_NUM_BUF];
+    vx_uint32 tmp_value = 0;
+
+    uint32_t num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    test_user_kernel_register(context);
+
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        in_value[buf_id] = 10*(buf_id+1);
+        ref_out_value[buf_id] = 2 * in_value[buf_id];
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    }
+    ASSERT_VX_OBJECT(d1    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+
+    ASSERT_VX_OBJECT(n0    = test_user_kernel_node(graph, d0[0], NULL, d1, NULL), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = test_user_kernel_node(graph, d1, d1, d2[0], NULL), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n1 index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n1, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            2,
+            graph_parameters_queue_params_list
+            ));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(d0[buf_id],
+            &in_value[buf_id],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_scalar, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_scalar, 1, &num_refs));
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+        /* compare output */
+        ASSERT_EQ_INT(tmp_value, ref_out_value[buf_id]);
+
+        /* clear value in output */
+        tmp_value = 0;
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_scalar, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_scalar, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseScalar(&d0[buf_id]));
+        VX_CALL(vxReleaseScalar(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseScalar(&d1));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    test_user_kernel_unregister(context);
+}
+
+/*
+ *  d0     n0     d1     n1     d2
+ * IMG -- NOT -- IMG -- NOT -- IMG
+ *
+ * This test case test the below
+ * - Single input, single output nodes
+ * - Two nodes on two different targets
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testManualSchedule, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_image d0[MAX_NUM_BUF], d1, d2[MAX_NUM_BUF];
+    vx_node n0, n1;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[3];
+
+    CT_Image ref_src[MAX_NUM_BUF], vxdst;
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+    ASSERT_VX_OBJECT(d1    = vxCreateVirtualImage(graph, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(n0    = vxNotNode(graph, d0[0], d1), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = vxNotNode(graph, d1, d2[0]), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n1 index 1, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n1, 1);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode manual is used, here we need to call vxScheduleGraph
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_MANUAL,
+            2,
+            graph_parameters_queue_params_list
+            ));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[buf_id]));
+    }
+
+    loop_cnt = (loop_cnt + num_buf) / num_buf;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt); loop_id++)
+    {
+        vx_image out_img[MAX_NUM_BUF], in_img[MAX_NUM_BUF];
+        uint32_t num_refs_in, num_refs_out;
+
+        /* enqueue input and output references,
+         * input and output can be enqueued in any order
+         * can be enqueued all together, here they are enqueue one by one just as a example
+         */
+        for(buf_id=0; buf_id<num_buf; buf_id++)
+        {
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        }
+
+        VX_CALL(vxScheduleGraph(graph));
+        VX_CALL(vxWaitGraph(graph));
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)out_img, num_buf, &num_refs_in));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)in_img, num_buf, &num_refs_out));
+
+        ASSERT_EQ_INT(num_refs_in, num_buf);
+        ASSERT_EQ_INT(num_refs_out, num_buf);
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt);
+        }
+
+        for(buf_id=0; buf_id<num_buf; buf_id++)
+        {
+            ASSERT_NO_FAILURE({
+                vxdst = ct_image_from_vx_image(out_img[buf_id]);
+            });
+
+            /* compare output */
+            ASSERT_EQ_CTIMAGE(ref_src[buf_id], vxdst);
+        }
+    }
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&d1));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+/*
+ *  d0                        n0           d2
+ * SCALAR -- delay (0) --  USER_KERNEL -- SCALAR
+ *               |            |
+ *           delay (-1) ------+
+ *
+ *
+ * This test case test the below
+ * - Delay objects
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testDelay1, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_scalar d0[MAX_NUM_BUF], d2[MAX_NUM_BUF], exemplar;
+    vx_delay delay;
+    vx_scalar in_scalar, out_scalar;
+    vx_node n0;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+    vx_uint32 in_value[MAX_NUM_BUF], ref_out_value[MAX_NUM_BUF];
+    vx_uint32 tmp_value = 0;
+
+    uint32_t num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    test_user_kernel_register(context);
+
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    /* since delay is of 2 slots, num_buf MUST be >= 2 at input atleast */
+    if(num_buf < 2)
+    {
+        num_buf = 2;
+    }
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        in_value[buf_id] = 10*(buf_id+1);
+    }
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ref_out_value[buf_id] = in_value[buf_id]
+                          + in_value[ (num_buf + buf_id-1)%num_buf ];
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    }
+
+    /* allocate output, delay slot 0 is d0[0], delay slot -1 is d0[num_buf-1]
+     * allocate other objects in between
+     */
+    ASSERT_VX_OBJECT(exemplar  = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(delay     = vxCreateDelay(context, (vx_reference)exemplar, 2), VX_TYPE_DELAY);
+    d0[0] = (vx_scalar)vxGetReferenceFromDelay(delay, 0);
+    for(buf_id=1; buf_id<num_buf-1; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    }
+    d0[num_buf-1] = (vx_scalar)vxGetReferenceFromDelay(delay, -1);
+    vxReleaseScalar(&exemplar);
+
+    ASSERT_VX_OBJECT(n0    = test_user_kernel_node(graph, d0[0], d0[num_buf-1], d2[0], NULL), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n0 index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n0, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            2,
+            graph_parameters_queue_params_list
+            ));
+
+    /* always auto age delay in pipelined graph */
+    VX_CALL(vxRegisterAutoAging(graph, delay));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(d0[buf_id],
+            &in_value[buf_id],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+    /* last buf is already set at the delay slot -1 so dont enqueue that ref */
+    for(buf_id=0; buf_id<num_buf-1; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf-1); loop_id++)
+    {
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_scalar, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_scalar, 1, &num_refs));
+
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+        /* compare output */
+        //printf(" %d: out = %d ref = %d\n", loop_id, tmp_value, ref_out_value[buf_id]);
+        ASSERT_EQ_INT(tmp_value, ref_out_value[buf_id]);
+
+        /* clear value in output */
+        tmp_value = 0;
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_scalar, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_scalar, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    vxWaitGraph(graph);
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    for(buf_id=1; buf_id<num_buf-1; buf_id++)
+    {
+        VX_CALL(vxReleaseScalar(&d0[buf_id]));
+    }
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseScalar(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseDelay(&delay));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    test_user_kernel_unregister(context);
+}
+
+/*
+ *  d0                        n0           d2
+ * SCALAR -- delay (0) --  USER_KERNEL -- SCALAR
+ *               |            |
+ *           delay (-1) ------+--- USER_KERNEL -- null
+ *               |                     n1
+ *               |                     |
+ *           delay (-2) ---------------+
+ *
+ * This test case test the below
+ * - Delay objects with 3 delay slots
+ * - Delay slot connected to two inputs
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testDelay2, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_scalar d0[MAX_NUM_BUF], d2[MAX_NUM_BUF], exemplar;
+    vx_delay delay;
+    vx_scalar in_scalar, out_scalar;
+    vx_node n0, n1;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+    vx_uint32 in_value[MAX_NUM_BUF], ref_out_value[MAX_NUM_BUF];
+    vx_uint32 tmp_value = 0;
+
+    uint32_t num_buf;
+    uint32_t buf_id, loop_id, loop_cnt, k;
+
+    test_user_kernel_register(context);
+
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    /* since delay is of 3 slots, num_buf MUST be >= 3 at input atleast */
+    if(num_buf < 3)
+    {
+        num_buf = 3;
+    }
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        in_value[buf_id] = 10*(buf_id+1);
+    }
+    k=0;
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ref_out_value[buf_id] = in_value[k]
+                          + in_value[ (num_buf + k - 2)%num_buf ];
+        k = (k+2)%num_buf;
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    }
+
+    /* allocate output, delay slot 0 is d0[0], delay slot -1 is d0[num_buf-1]
+     * allocate other objects in between
+     */
+    ASSERT_VX_OBJECT(exemplar  = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(delay     = vxCreateDelay(context, (vx_reference)exemplar, 3), VX_TYPE_DELAY);
+    d0[0] = (vx_scalar)vxGetReferenceFromDelay(delay, 0);
+    for(buf_id=1; buf_id<num_buf-2; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    }
+    d0[num_buf-2] = (vx_scalar)vxGetReferenceFromDelay(delay, -1);
+    d0[num_buf-1] = (vx_scalar)vxGetReferenceFromDelay(delay, -2);
+    VX_CALL(vxReleaseScalar(&exemplar));
+
+    ASSERT_VX_OBJECT(n0    = test_user_kernel_node(graph, d0[0], d0[num_buf-2], d2[0], NULL), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = test_user_kernel_node(graph, d0[num_buf-1], d0[num_buf-2], NULL, NULL), VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n0 index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n0, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            2,
+            graph_parameters_queue_params_list
+            ));
+
+    /* always auto age delay in pipelined graph */
+    VX_CALL(vxRegisterAutoAging(graph, delay));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(d0[buf_id],
+            &in_value[buf_id],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+    /* last buf is already set at the delay slot -1 so dont enqueue that ref */
+    for(buf_id=0; buf_id<num_buf-2; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf-2); loop_id++)
+    {
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_scalar, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_scalar, 1, &num_refs));
+
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+        /* compare output */
+        //printf(" %d: out = %d ref = %d\n", loop_id, tmp_value, ref_out_value[buf_id]);
+        ASSERT_EQ_INT(tmp_value, ref_out_value[buf_id]);
+
+        /* clear value in output */
+        tmp_value = 0;
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_scalar, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_scalar, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    for(buf_id=1; buf_id<num_buf-2; buf_id++)
+    {
+        VX_CALL(vxReleaseScalar(&d0[buf_id]));
+    }
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseScalar(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseDelay(&delay));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    test_user_kernel_unregister(context);
+}
+
+/*
+ *  d0           n0                           n1            d2
+ * SCALAR -- USER_KERNEL -- delay (-1) --  USER_KERNEL -- SCALAR
+ *                             |            |
+ *                         delay (-2) ------+--- USER_KERNEL -- null
+ *                             |                     n2
+ *                             |                     |
+ *                         delay (0)  ---------------+
+ *
+ * This test case test the below
+ * - Delay objects with 3 delay slots
+ * - Delay slot connected to two inputs
+ * - Delay intermediate to a graph, no graph parameter at any delay slot
+ * - node output to delay slot -1 (instead of typical slot 0)
+ * - multiple buffers at output of n0 i.e delay slot -1
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testDelay3, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_scalar d0[MAX_NUM_BUF], d2[MAX_NUM_BUF], exemplar;
+    vx_delay delay;
+    vx_scalar in_scalar, out_scalar;
+    vx_node n0, n1, n2;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+    vx_uint32 in_value[MAX_NUM_BUF], ref_out_value[MAX_NUM_BUF];
+    vx_uint32 tmp_value = 0;
+
+    uint32_t num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    test_user_kernel_register(context);
+
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    /* since delay is of 3 slots, num_buf MUST be >= 3 at input atleast */
+    if(num_buf < 3)
+    {
+        num_buf = 3;
+    }
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        in_value[buf_id] = 10*(buf_id+1);
+    }
+
+    {
+        uint32_t tmp_value[3];
+
+        tmp_value[0] = 0;
+        tmp_value[1] = in_value[num_buf-1];
+        tmp_value[2] = in_value[num_buf-2];
+
+        for(buf_id=0; buf_id<num_buf; buf_id++)
+        {
+            ref_out_value[buf_id] = in_value[buf_id]
+                              + tmp_value[ 1 ];
+
+            tmp_value[ 0 ] = tmp_value[ 2 ];
+            tmp_value[ 2 ] = tmp_value[ 1 ];
+            tmp_value[ 1 ] = in_value[buf_id];
+        }
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    }
+
+    /* allocate delay
+     */
+    ASSERT_VX_OBJECT(exemplar  = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(delay     = vxCreateDelay(context, (vx_reference)exemplar, 3), VX_TYPE_DELAY);
+    vxReleaseScalar(&exemplar);
+
+    ASSERT_VX_OBJECT(
+        n0 = test_user_kernel_node( graph,
+                d0[0], NULL,
+                (vx_scalar)vxGetReferenceFromDelay(delay, -1), NULL),
+                VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(
+        n1 = test_user_kernel_node(graph,
+                (vx_scalar)vxGetReferenceFromDelay(delay, -1), (vx_scalar)vxGetReferenceFromDelay(delay, -2),
+                d2[0], NULL),
+                VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(
+        n2 = test_user_kernel_node(graph,
+                (vx_scalar)vxGetReferenceFromDelay(delay, -2), (vx_scalar)vxGetReferenceFromDelay(delay, 0),
+                NULL, NULL),
+                VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n1 index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n1, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            2,
+            graph_parameters_queue_params_list
+            ));
+
+    /* always auto age delay in pipelined graph */
+    VX_CALL(vxRegisterAutoAging(graph, delay));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(d0[buf_id],
+            &in_value[buf_id],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+    }
+    {
+        vx_scalar tmp_scalar;
+
+        tmp_scalar = (vx_scalar)vxGetReferenceFromDelay(delay, 0);
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(tmp_scalar,
+            &in_value[num_buf-2],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+
+        tmp_scalar = (vx_scalar)vxGetReferenceFromDelay(delay, -2);
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(tmp_scalar,
+            &in_value[num_buf-1],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_scalar, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_scalar, 1, &num_refs));
+
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+        /* compare output */
+        //printf(" %d: out = %d ref = %d\n", loop_id, tmp_value, ref_out_value[buf_id]);
+        ASSERT_EQ_INT(tmp_value, ref_out_value[buf_id]);
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        /* clear value in output */
+        tmp_value = 0;
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_scalar, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_scalar, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    VX_CALL(vxReleaseNode(&n2));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseScalar(&d0[buf_id]));
+        VX_CALL(vxReleaseScalar(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseDelay(&delay));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    test_user_kernel_unregister(context);
+}
+
+/*
+ *  d0           n0                           n1            d2
+ * SCALAR -- USER_KERNEL -- delay (0) --  USER_KERNEL -- SCALAR
+ *                             |            |
+ *                          delay (-1)      |
+ *                             |            |
+ *                          delay (-2)      |
+ *                             |            |
+ *                          delay (-3) -----+
+ *
+ * This test case test the below
+ * - Delay objects with 4 delay slots
+ * - Delay intermediate to a graph, no graph parameter at any delay slot
+ * - Delay with slot's not connected to any input - tests auto age at these slots
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testDelay4, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_scalar d0[MAX_NUM_BUF], d2[MAX_NUM_BUF], exemplar;
+    vx_delay delay;
+    vx_scalar in_scalar, out_scalar;
+    vx_node n0, n1;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+    vx_uint32 in_value[MAX_NUM_BUF], ref_out_value;
+    vx_uint32 ref_delay_value[MAX_NUM_BUF];
+    vx_uint32 tmp_value = 0;
+
+    uint32_t num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    test_user_kernel_register(context);
+
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    /* since delay is of 4 slots, num_buf MUST be >= 4 at input atleast */
+    if(num_buf < 4)
+    {
+        num_buf = 4;
+    }
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        in_value[buf_id] = 10*(buf_id+1);
+    }
+
+    ref_delay_value[0] = 0;
+    ref_delay_value[1] = in_value[num_buf-3];
+    ref_delay_value[2] = in_value[num_buf-2];
+    ref_delay_value[3] = in_value[num_buf-1];
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    }
+
+    /* allocate delay
+     */
+    ASSERT_VX_OBJECT(exemplar  = vxCreateScalar(context, VX_TYPE_UINT32, &tmp_value), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(delay     = vxCreateDelay(context, (vx_reference)exemplar, 4), VX_TYPE_DELAY);
+    vxReleaseScalar(&exemplar);
+
+    ASSERT_VX_OBJECT(
+        n0 = test_user_kernel_node( graph,
+                d0[0], NULL,
+                (vx_scalar)vxGetReferenceFromDelay(delay, 0), NULL),
+                VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(
+        n1 = test_user_kernel_node(graph,
+                (vx_scalar)vxGetReferenceFromDelay(delay, 0), (vx_scalar)vxGetReferenceFromDelay(delay, -3),
+                d2[0], NULL),
+                VX_TYPE_NODE);
+
+    /* input @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n1 index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n1, 2);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            2,
+            graph_parameters_queue_params_list
+            ));
+
+    /* always auto age delay in pipelined graph */
+    VX_CALL(vxRegisterAutoAging(graph, delay));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(d0[buf_id],
+            &in_value[buf_id],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+    }
+    {
+        vx_scalar tmp_scalar;
+
+        tmp_scalar = (vx_scalar)vxGetReferenceFromDelay(delay, -1);
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(tmp_scalar,
+            &in_value[num_buf-3],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+
+        tmp_scalar = (vx_scalar)vxGetReferenceFromDelay(delay, -2);
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(tmp_scalar,
+            &in_value[num_buf-2],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+
+        tmp_scalar = (vx_scalar)vxGetReferenceFromDelay(delay, -3);
+        ASSERT_NO_FAILURE(
+            vxCopyScalar(tmp_scalar,
+            &in_value[num_buf-1],
+            VX_WRITE_ONLY,
+            VX_MEMORY_TYPE_HOST));
+
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+    }
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        uint32_t num_refs;
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&out_scalar, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&in_scalar, 1, &num_refs));
+
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+        ref_out_value = in_value[buf_id] + ref_delay_value[ 3 ];
+
+        ref_delay_value[ 3 ] = ref_delay_value[ 2 ];
+        ref_delay_value[ 2 ] = ref_delay_value[ 1 ];
+        ref_delay_value[ 1 ] = in_value[buf_id];
+
+        /* compare output */
+        //printf(" %d: out = %d ref = %d\n", loop_id, tmp_value, ref_out_value);
+        ASSERT_EQ_INT(tmp_value, ref_out_value);
+
+        /* clear value in output */
+        tmp_value = 0;
+        VX_CALL(vxCopyScalar(out_scalar, &tmp_value, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&out_scalar, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&in_scalar, 1));
+        }
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseScalar(&d0[buf_id]));
+        VX_CALL(vxReleaseScalar(&d2[buf_id]));
+    }
+    VX_CALL(vxReleaseDelay(&delay));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    test_user_kernel_unregister(context);
+}
+
+/*
+ *  d0     n0     d2     n1     d3     n2     d4
+ * IMG -- ADD -- IMG -- NOT -- IMG -- NOT -- IMG
+ *         |                    |
+ *         |                    |
+ *         +--------------------+
+ *
+ * This test case test for loop carried dependency functional correctness
+ *
+ */
+TEST_WITH_ARG(GraphPipeline, testLoopCarriedDependency, Arg, PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_graph graph;
+    vx_delay delay;
+    vx_image delay_image;
+    vx_image d0[MAX_NUM_BUF], d2[MAX_NUM_BUF], d4[MAX_NUM_BUF];
+    vx_node n0, n1, n2;
+    vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[3];
+
+    int i;
+    vx_graph graph_1 = 0;
+    vx_image images[4];
+    vx_node nodes[3];
+    vx_delay delay_1 = 0;
+    vx_image delay_image_0 = 0;
+    vx_image delay_image_1 = 0;
+    vx_image delay_image_0_nopipeline = 0;
+    vx_image delay_image_1_nopipeline = 0;
+    vx_imagepatch_addressing_t addr;
+    vx_uint8 *pdata = 0;
+    vx_rectangle_t rect = {0, 0, arg_->width, arg_->height};
+    vx_map_id map_id;
+
+    CT_Image ref_src[MAX_NUM_BUF], ref_src1[MAX_NUM_BUF], vxdst0, vxdst1;
+    uint32_t width, height, seq_init, num_buf;
+    uint32_t buf_id, loop_id, loop_cnt;
+
+    seq_init = 1;
+    width = arg_->width;
+    height = arg_->height;
+    num_buf = arg_->num_buf;
+    loop_cnt = arg_->loop_count;
+
+    ASSERT(num_buf <= MAX_NUM_BUF);
+
+    /* fill reference data */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE({
+            ref_src[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+        ASSERT_NO_FAILURE({
+            ref_src1[buf_id] = ct_allocate_image(width, height, VX_DF_IMAGE_U8);
+            fillSequence(ref_src1[buf_id], (uint32_t)(seq_init+buf_id*10));
+        });
+    }
+
+    /* Non-pipelining graph */
+    ASSERT_VX_OBJECT(graph_1 = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    ASSERT_VX_OBJECT(images[0] = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(images[1] = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(images[2] = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(images[3] = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(ct_image_copyto_vx_image(images[0], ref_src[0]));
+
+    ASSERT_VX_OBJECT(delay_1 = vxCreateDelay(context, (vx_reference)images[3], 2), VX_TYPE_DELAY);
+
+    ASSERT_VX_OBJECT(delay_image_0_nopipeline = (vx_image)vxGetReferenceFromDelay(delay_1, 0), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(delay_image_1_nopipeline = (vx_image)vxGetReferenceFromDelay(delay_1,-1), VX_TYPE_IMAGE);
+
+    /* Filling reference data */
+    pdata = NULL;
+    VX_CALL(vxMapImagePatch(delay_image_0_nopipeline, &rect, 0, &map_id, &addr, (void **)&pdata,
+                                                    VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
+    for (i = 0; i < width*height; i++)
+    {
+        *(pdata+i) = 1;
+    }
+    VX_CALL(vxUnmapImagePatch(delay_image_0_nopipeline, map_id));
+
+    pdata = NULL;
+    VX_CALL(vxMapImagePatch(delay_image_1_nopipeline, &rect, 0, &map_id, &addr, (void **)&pdata,
+                                                    VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
+    for (i = 0; i < width*height; i++)
+    {
+        *(pdata+i) = 1;
+    }
+    VX_CALL(vxUnmapImagePatch(delay_image_1_nopipeline, map_id));
+
+    ASSERT_VX_OBJECT(nodes[0] = vxAddNode(graph_1, images[0], (vx_image)vxGetReferenceFromDelay(delay_1, -1), VX_CONVERT_POLICY_WRAP, images[1]), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(nodes[1] = vxNotNode(graph_1, images[1], (vx_image)vxGetReferenceFromDelay(delay_1, 0)), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(nodes[2] = vxNotNode(graph_1, (vx_image)vxGetReferenceFromDelay(delay_1, 0), images[2]), VX_TYPE_NODE);
+
+    VX_CALL(vxRegisterAutoAging(graph_1, delay_1));
+    VX_CALL(vxVerifyGraph(graph_1));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* allocate Input and Output refs, multiple refs created to allow pipelining of graph */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_VX_OBJECT(d0[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d2[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(d4[buf_id]    = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    }
+
+    ASSERT_VX_OBJECT(delay_image = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(delay = vxCreateDelay(context, (vx_reference)delay_image, 2), VX_TYPE_DELAY);
+
+    ASSERT_VX_OBJECT(delay_image_0 = (vx_image)vxGetReferenceFromDelay(delay, 0), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(delay_image_1 = (vx_image)vxGetReferenceFromDelay(delay, -1), VX_TYPE_IMAGE);
+
+    /* Filling reference data */
+    pdata = NULL;
+    VX_CALL(vxMapImagePatch(delay_image_0, &rect, 0, &map_id, &addr, (void **)&pdata,
+                                                    VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
+    for (i = 0; i < width*height; i++)
+    {
+        *(pdata+i) = 1;
+    }
+    VX_CALL(vxUnmapImagePatch(delay_image_0, map_id));
+
+    pdata = NULL;
+    VX_CALL(vxMapImagePatch(delay_image_1, &rect, 0, &map_id, &addr, (void **)&pdata,
+                                                    VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
+    for (i = 0; i < width*height; i++)
+    {
+        *(pdata+i) = 1;
+    }
+    VX_CALL(vxUnmapImagePatch(delay_image_1, map_id));
+    
+
+    ASSERT_VX_OBJECT(n0    = vxAddNode(graph, d0[0], (vx_image)vxGetReferenceFromDelay(delay, -1), VX_CONVERT_POLICY_WRAP, d2[0]), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n1    = vxNotNode(graph, d2[0], (vx_image)vxGetReferenceFromDelay(delay, 0)), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(n2    = vxNotNode(graph, (vx_image)vxGetReferenceFromDelay(delay, 0), d4[0]), VX_TYPE_NODE);
+
+    /* input0 @ n0 index 0, becomes graph parameter 0 */
+    add_graph_parameter_by_node_index(graph, n0, 0);
+    /* output @ n0 index 2, becomes graph parameter 1 */
+    add_graph_parameter_by_node_index(graph, n0, 3);
+    /* output @ n2 index 1, becomes graph parameter 2 */
+    add_graph_parameter_by_node_index(graph, n2, 1);
+
+    /* set graph schedule config such that graph parameter @ index 0, 1, 2 are enqueuable */
+    graph_parameters_queue_params_list[0].graph_parameter_index = 0;
+    graph_parameters_queue_params_list[0].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[0].refs_list = (vx_reference*)&d0[0];
+
+    graph_parameters_queue_params_list[1].graph_parameter_index = 1;
+    graph_parameters_queue_params_list[1].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[1].refs_list = (vx_reference*)&d2[0];
+
+    graph_parameters_queue_params_list[2].graph_parameter_index = 2;
+    graph_parameters_queue_params_list[2].refs_list_size = num_buf;
+    graph_parameters_queue_params_list[2].refs_list = (vx_reference*)&d4[0];
+
+    /* Schedule mode auto is used, here we dont need to call vxScheduleGraph
+     * Graph gets scheduled automatically as refs are enqueued to it
+     */
+    VX_CALL(vxSetGraphScheduleConfig(graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            3,
+            graph_parameters_queue_params_list
+            ));
+
+    /* always auto age delay in pipelined graph */
+    VX_CALL(vxRegisterAutoAging(graph, delay));
+
+    VX_CALL(vxVerifyGraph(graph));
+
+    #if 1
+    /* fill reference data into input data reference */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        ASSERT_NO_FAILURE(ct_image_copyto_vx_image(d0[buf_id], ref_src[0]));
+    }
+
+    /* enqueue input and output references,
+     * input and output can be enqueued in any order
+     * can be enqueued all together, here they are enqueue one by one just as a example
+     */
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&d2[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&d0[buf_id], 1));
+        VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&d4[buf_id], 1));
+    }
+
+    buf_id = 0;
+
+    /* wait for graph instances to complete, compare output and recycle data buffers, schedule again */
+    for(loop_id=0; loop_id<(loop_cnt+num_buf); loop_id++)
+    {
+        vx_image add_in0_img, add_out_img, not_out1_img;
+        uint32_t num_refs;
+
+        VX_CALL(vxProcessGraph(graph_1));
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 2, (vx_reference*)&not_out1_img, 1, &num_refs));
+
+        /* Get output reference, waits until a reference is available */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 1, (vx_reference*)&add_out_img, 1, &num_refs));
+
+        /* Get consumed input reference, waits until a reference is available
+         */
+        VX_CALL(vxGraphParameterDequeueDoneRef(graph, 0, (vx_reference*)&add_in0_img, 1, &num_refs));
+
+        /* when measuring performance dont check output since it affects graph performance numbers
+         */
+
+        if(loop_cnt > 100)
+        {
+            ct_update_progress(loop_id, loop_cnt+num_buf);
+        }
+
+        ASSERT_NO_FAILURE({
+            vxdst0 = ct_image_from_vx_image(not_out1_img);
+        });
+
+        ASSERT_NO_FAILURE({
+            vxdst1 = ct_image_from_vx_image(images[2]);
+        });
+
+        ASSERT_EQ_CTIMAGE(vxdst1, vxdst0);
+
+        buf_id = (buf_id+1)%num_buf;
+
+        /* recycles dequeued input and output refs 'loop_cnt' times */
+
+        if(loop_id<loop_cnt)
+        {
+            /* input and output can be enqueued in any order */
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 1, (vx_reference*)&add_out_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 0, (vx_reference*)&add_in0_img, 1));
+            VX_CALL(vxGraphParameterEnqueueReadyRef(graph, 2, (vx_reference*)&not_out1_img, 1));
+        }
+
+    }
+
+    /* ensure all graph processing is complete */
+    VX_CALL(vxWaitGraph(graph));
+
+    #endif
+
+    VX_CALL(vxReleaseNode(&n0));
+    VX_CALL(vxReleaseNode(&n1));
+    VX_CALL(vxReleaseNode(&n2));
+    for(buf_id=0; buf_id<num_buf; buf_id++)
+    {
+        VX_CALL(vxReleaseImage(&d0[buf_id]));
+        VX_CALL(vxReleaseImage(&d2[buf_id]));
+        VX_CALL(vxReleaseImage(&d4[buf_id]));
+    }
+    VX_CALL(vxReleaseImage(&delay_image));
+    VX_CALL(vxReleaseDelay(&delay));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    for (i = 0; i < (sizeof(nodes)/sizeof(nodes[0])); i++)
+    {
+        VX_CALL(vxReleaseNode(&nodes[i]));
+    }
+
+    for (i = 0; i < (sizeof(images)/sizeof(images[0])); i++)
+    {
+        VX_CALL(vxReleaseImage(&images[i]));
+    }
+
+    VX_CALL(vxReleaseGraph(&graph_1));
+    VX_CALL(vxReleaseDelay(&delay_1));
+
+    ASSERT(graph_1 == 0);
+    ASSERT(delay_1 == 0);
+
+    CT_CollectGarbage(CT_GC_ALL);
+}
+
+TESTCASE_TESTS(GraphPipeline,
+    testOneNode,
+    testTwoNodesBasic,
+    testTwoNodes,
+    testFourNodes,
+    testMaxDataRef,
+    testUniformImage,
+    testScalarOutput,
+    testEventHandling,
+    testEventHandlingDisableEvents,
+    testReplicateImage,
+    testUserKernel,
+    testManualSchedule,
+    /*testDelay1,
+    testDelay2,
+    testDelay3,
+    testDelay4,*/
+    testLoopCarriedDependency
+    )
+
+#endif
diff --git a/test_conformance/test_graph_roi.c b/test_conformance/test_graph_roi.c
index 4ffb735..7afd0cf 100644
--- a/test_conformance/test_graph_roi.c
+++ b/test_conformance/test_graph_roi.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -151,3 +153,5 @@
         testSimple,
         testCallbackOrder
         )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_graph_streaming.c b/test_conformance/test_graph_streaming.c
new file mode 100644
index 0000000..bc166d1
--- /dev/null
+++ b/test_conformance/test_graph_streaming.c
@@ -0,0 +1,665 @@
+/*
+ * Copyright (c) 2012-2019 The Khronos Group Inc.
+ *
+ * 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.
+ */
+
+#ifdef OPENVX_USE_STREAMING
+
+#include "test_engine/test.h"
+
+#include <VX/vx.h>
+#include <VX/vxu.h>
+#include <VX/vx_khr_pipelining.h>
+
+#include "math.h"
+#include <limits.h>
+
+TESTCASE(GraphStreaming,  CT_VXContext, ct_setup_vx_context, 0)
+
+#define VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1 (VX_KERNEL_BASE(VX_ID_DEFAULT, 0) + 3)
+#define VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1_NAME "org.khronos.openvx.test.user_source_1"
+
+#define VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2 (VX_KERNEL_BASE(VX_ID_DEFAULT, 0) + 4)
+#define VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2_NAME "org.khronos.openvx.test.user_source_2"
+
+#define VX_KERNEL_CONFORMANCE_TEST_USER_SINK (VX_KERNEL_BASE(VX_ID_DEFAULT, 0) + 5)
+#define VX_KERNEL_CONFORMANCE_TEST_USER_SINK_NAME "org.khronos.openvx.test.user_sink"
+#define PIPEUP_NUM_BUFS 3
+
+typedef enum _own_source_params_e
+{
+    OWN_SOURCE_PARAM_OUTPUT = 0
+} own_source_params_e;
+
+typedef enum _own_sink_params_e
+{
+    OWN_SINK_PARAM_INPUT = 0
+} own_sink_params_e;
+
+static enum vx_type_e type = (enum vx_type_e)VX_TYPE_SCALAR;
+
+static vx_bool is_pipeup_entered = vx_false_e;
+static vx_bool is_steady_state_entered = vx_false_e;
+static uint8_t pipeup_frame = 0;
+static uint8_t global_value = 0;
+static uint8_t copy_value[PIPEUP_NUM_BUFS-1];
+static uint8_t golden_sink_value = 0;
+
+static vx_status VX_CALLBACK own_source1_Kernel(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    uint32_t state;
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+    uint8_t i;
+
+    vxQueryNode(node, VX_NODE_STATE, &state, sizeof(state));
+    EXPECT(parameters != NULL);
+    EXPECT(num == 1);
+    if (parameters != NULL && num == 1)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+
+        if (255 == global_value)
+        {
+            global_value = 0;
+        }
+        else
+        {
+            global_value++;
+        }
+
+        if (state == VX_NODE_STATE_STEADY)
+        {
+            is_steady_state_entered = vx_true_e;
+
+            vxCopyScalar((vx_scalar)parameters[0], &copy_value[0], VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+
+            for (i = 0; i < pipeup_frame-1; i++)
+            {
+                copy_value[i] = copy_value[i+1];
+            }
+
+            copy_value[pipeup_frame-1] = global_value;
+        }
+        else
+        {
+            is_pipeup_entered = vx_true_e;
+            copy_value[pipeup_frame] = global_value;
+            pipeup_frame++;
+        }
+    }
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK own_source2_Kernel(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    uint32_t state;
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+
+    vxQueryNode(node, VX_NODE_STATE, &state, sizeof(state));
+    EXPECT(parameters != NULL);
+    EXPECT(num == 1);
+    if (parameters != NULL && num == 1)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+
+        if (255 == global_value)
+        {
+            global_value = 0;
+        }
+        else
+        {
+            global_value++;
+        }
+
+        vxCopyScalar((vx_scalar)parameters[0], &global_value, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+    }
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK own_sink_Kernel(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    uint8_t local_copy_value = 0;
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+
+    EXPECT(parameters != NULL);
+    EXPECT(num == 1);
+    if (parameters != NULL && num == 1)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+        vxCopyScalar((vx_scalar)parameters[0], &local_copy_value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
+
+        if (255 == golden_sink_value)
+        {
+            golden_sink_value = 0;
+        }
+        else
+        {
+            golden_sink_value++;
+        }
+
+        EXPECT(local_copy_value == golden_sink_value);
+    }
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK own_Initialize(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+    EXPECT(parameters != NULL);
+    EXPECT(num == 1);
+    if (parameters != NULL && num == 1)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+    }
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK own_Deinitialize(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    EXPECT(node != 0);
+    EXPECT(parameters != NULL);
+    EXPECT(num == 1);
+    if (parameters != NULL && num == 1)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+    }
+
+    return VX_SUCCESS;
+}
+
+/* Source with buffering */
+static void own_register_source1_kernel(vx_context context)
+{
+    vx_kernel kernel = 0;
+    vx_uint32 num_bufs = PIPEUP_NUM_BUFS;
+
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1_NAME,
+        VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1,
+        own_source1_Kernel,
+        1,
+        NULL,
+        own_Initialize,
+        own_Deinitialize), VX_TYPE_KERNEL);
+
+    VX_CALL(vxSetKernelAttribute(kernel, VX_KERNEL_PIPEUP_OUTPUT_DEPTH, &num_bufs, sizeof(num_bufs)));
+
+    VX_CALL(vxAddParameterToKernel(kernel, OWN_SOURCE_PARAM_OUTPUT, VX_OUTPUT, type, VX_PARAMETER_STATE_REQUIRED));
+    {
+        vx_parameter parameter = 0;
+        vx_enum direction = 0;
+        ASSERT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, OWN_SOURCE_PARAM_OUTPUT), VX_TYPE_PARAMETER);
+        VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_DIRECTION, &direction, sizeof(direction)));
+        ASSERT(direction == VX_OUTPUT);
+        VX_CALL(vxReleaseParameter(&parameter));
+    }
+    VX_CALL(vxFinalizeKernel(kernel));
+    VX_CALL(vxReleaseKernel(&kernel));
+}
+
+/* Source without buffering */
+static void own_register_source2_kernel(vx_context context)
+{
+    vx_kernel kernel = 0;
+
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2_NAME,
+        VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2,
+        own_source2_Kernel,
+        1,
+        NULL,
+        own_Initialize,
+        own_Deinitialize), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, OWN_SOURCE_PARAM_OUTPUT, VX_OUTPUT, type, VX_PARAMETER_STATE_REQUIRED));
+    {
+        vx_parameter parameter = 0;
+        vx_enum direction = 0;
+        ASSERT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, OWN_SOURCE_PARAM_OUTPUT), VX_TYPE_PARAMETER);
+        VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_DIRECTION, &direction, sizeof(direction)));
+        ASSERT(direction == VX_OUTPUT);
+        VX_CALL(vxReleaseParameter(&parameter));
+    }
+    VX_CALL(vxFinalizeKernel(kernel));
+    VX_CALL(vxReleaseKernel(&kernel));
+}
+
+static void own_register_sink_kernel(vx_context context)
+{
+    vx_kernel kernel = 0;
+
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_KERNEL_CONFORMANCE_TEST_USER_SINK_NAME,
+        VX_KERNEL_CONFORMANCE_TEST_USER_SINK,
+        own_sink_Kernel,
+        1,
+        NULL,
+        own_Initialize,
+        own_Deinitialize), VX_TYPE_KERNEL);
+
+    VX_CALL(vxAddParameterToKernel(kernel, OWN_SINK_PARAM_INPUT, VX_INPUT, type, VX_PARAMETER_STATE_REQUIRED));
+    {
+        vx_parameter parameter = 0;
+        vx_enum direction = 0;
+        ASSERT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, OWN_SINK_PARAM_INPUT), VX_TYPE_PARAMETER);
+        VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_DIRECTION, &direction, sizeof(direction)));
+        ASSERT(direction == VX_INPUT);
+        VX_CALL(vxReleaseParameter(&parameter));
+    }
+    VX_CALL(vxFinalizeKernel(kernel));
+    VX_CALL(vxReleaseKernel(&kernel));
+}
+
+typedef struct {
+    const char* name;
+    int stream_time;
+    int source;
+} Arg;
+
+#define STREAMING_PARAMETERS \
+    CT_GENERATE_PARAMETERS("streaming_with_buffering", ARG, 100, 1), \
+    CT_GENERATE_PARAMETERS("streaming_with_buffering", ARG, 1000, 1), \
+    CT_GENERATE_PARAMETERS("streaming_with_buffering", ARG, 10000, 1), \
+    CT_GENERATE_PARAMETERS("streaming_with_buffering", ARG, 100, 2), \
+    CT_GENERATE_PARAMETERS("streaming_with_buffering", ARG, 1000, 2), \
+    CT_GENERATE_PARAMETERS("streaming_with_buffering", ARG, 10000, 2), \
+
+/*
+ *     node       scalar
+ * USER_SOURCE -- SCALAR
+ *
+ * Test case of a graph with single user source node outputting a scalar
+ * Two possible source kernels are used, one containing a pipeup loop and the other without pipeup
+ * In the case of a kernel with pipeup, a flag is checked whether or not the kernel entered the pipeup
+ * The scalar sources act as counters that increment the output upon each graph execution
+ * Upon subsequent graph executions, the outputs are check that they are incrementing
+ *
+ */
+TEST_WITH_ARG(GraphStreaming, testSourceUserKernel, Arg, STREAMING_PARAMETERS)
+{
+    vx_graph graph;
+    vx_context context = context_->vx_context_;
+    vx_kernel user_kernel = 0;
+    vx_node node = 0;
+    vx_uint8  scalar_val = 0;
+    vx_scalar scalar;
+    int i;
+
+    for (i = 0; i < (PIPEUP_NUM_BUFS-1); i++)
+    {
+        copy_value[i] = 0;
+    }
+    pipeup_frame = 0;
+    global_value = 0;
+
+    ASSERT_VX_OBJECT(scalar = vxCreateScalar(context, VX_TYPE_UINT8, &scalar_val), VX_TYPE_SCALAR);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_NO_FAILURE(own_register_source1_kernel(context));
+    }
+    else
+    {
+        ASSERT_NO_FAILURE(own_register_source2_kernel(context));
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_VX_OBJECT(user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1_NAME), VX_TYPE_KERNEL);
+    }
+    else
+    {
+        ASSERT_VX_OBJECT(user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2_NAME), VX_TYPE_KERNEL);
+    }
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, user_kernel), VX_TYPE_NODE);
+
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)scalar));
+
+    is_pipeup_entered = vx_false_e;
+    is_steady_state_entered = vx_false_e;
+
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxCopyScalar(scalar, &scalar_val, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+    ASSERT(scalar_val == 1);
+
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxCopyScalar(scalar, &scalar_val, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+    ASSERT(scalar_val == 2);
+
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxCopyScalar(scalar, &scalar_val, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+    ASSERT(scalar_val == 3);
+
+    if (arg_->source == 1)
+    {
+        ASSERT(is_pipeup_entered == vx_true_e);
+        ASSERT(is_steady_state_entered == vx_true_e);
+    }
+
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    /* user kernel should be removed only after all references to it released */
+    /* Note, vxRemoveKernel doesn't zeroing kernel ref */
+    VX_CALL(vxRemoveKernel(user_kernel));
+
+    VX_CALL(vxReleaseScalar(&scalar));
+
+    ASSERT(node == 0);
+    ASSERT(graph == 0);
+    ASSERT(scalar == 0);
+}
+
+/*
+ *     node1      scalar      node2
+ * USER_SOURCE -- SCALAR -- USER_SINK
+ *
+ * Test case of a graph with a user source node outputting a scalar connected to a user sink node
+ * Two possible source kernels are used, one containing a pipeup loop and the other without pipeup
+ * In the case of a kernel with pipeup, a flag is checked whether or not the kernel entered the pipeup
+ * The scalar sources act as counters that increment the output upon each graph execution
+ * Error checking occurs in the sink node, as it expects the source node to increment the input to node
+ *
+ */
+TEST_WITH_ARG(GraphStreaming, testSourceSinkUserKernel, Arg, STREAMING_PARAMETERS)
+{
+    vx_graph graph;
+    vx_context context = context_->vx_context_;
+    vx_kernel source_user_kernel = 0, sink_user_kernel = 0;
+    vx_node node1 = 0, node2 = 0;
+    vx_uint8  scalar_val = 0;
+    vx_scalar scalar;
+    int i;
+
+    for (i = 0; i < (PIPEUP_NUM_BUFS-1); i++)
+    {
+        copy_value[i] = 0;
+    }
+    pipeup_frame = 0;
+    global_value = 0;
+    golden_sink_value = 0;
+
+    ASSERT_VX_OBJECT(scalar = vxCreateScalar(context, VX_TYPE_UINT8, &scalar_val), VX_TYPE_SCALAR);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_NO_FAILURE(own_register_source1_kernel(context));
+    }
+    else
+    {
+        ASSERT_NO_FAILURE(own_register_source2_kernel(context));
+    }
+
+    ASSERT_NO_FAILURE(own_register_sink_kernel(context));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_VX_OBJECT(source_user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1_NAME), VX_TYPE_KERNEL);
+    }
+    else
+    {
+        ASSERT_VX_OBJECT(source_user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2_NAME), VX_TYPE_KERNEL);
+    }
+
+    ASSERT_VX_OBJECT(sink_user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SINK_NAME), VX_TYPE_KERNEL);
+
+    ASSERT_VX_OBJECT(node1 = vxCreateGenericNode(graph, source_user_kernel), VX_TYPE_NODE);
+
+    ASSERT_VX_OBJECT(node2 = vxCreateGenericNode(graph, sink_user_kernel), VX_TYPE_NODE);
+
+    VX_CALL(vxSetParameterByIndex(node1, 0, (vx_reference)scalar));
+
+    VX_CALL(vxSetParameterByIndex(node2, 0, (vx_reference)scalar));
+
+    is_pipeup_entered = vx_false_e;
+    is_steady_state_entered = vx_false_e;
+
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxProcessGraph(graph));
+
+    if (arg_->source == 1)
+    {
+        ASSERT(is_pipeup_entered == vx_true_e);
+        ASSERT(is_steady_state_entered == vx_true_e);
+    }
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseNode(&node2));
+    VX_CALL(vxReleaseGraph(&graph));
+    /* user kernel should be removed only after all references to it released */
+    /* Note, vxRemoveKernel doesn't zeroing kernel ref */
+    VX_CALL(vxRemoveKernel(source_user_kernel));
+    VX_CALL(vxRemoveKernel(sink_user_kernel));
+
+    VX_CALL(vxReleaseScalar(&scalar));
+
+    ASSERT(node1 == 0);
+    ASSERT(node2 == 0);
+    ASSERT(graph == 0);
+    ASSERT(scalar == 0);
+}
+
+/*
+ *     node       scalar
+ * USER_SOURCE -- SCALAR
+ *
+ * Test case of a graph with single user source node outputting a scalar
+ * Two possible source kernels are used, one containing a pipeup loop and the other without pipeup
+ * In the case of a kernel with pipeup, a flag is checked whether or not the kernel entered the pipeup
+ * The scalar sources act as counters that increment the output upon each graph execution
+ * Error checking occurs in the sink node, as it expects the source node to increment the input to node
+ * Streaming is enabled on the graph.  Streaming starts then stops after a specified delay.
+ *
+ */
+TEST_WITH_ARG(GraphStreaming, testSourceUserKernelStreaming, Arg, STREAMING_PARAMETERS)
+{
+    vx_graph graph;
+    vx_context context = context_->vx_context_;
+    vx_kernel user_kernel = 0;
+    vx_node node = 0;
+    vx_uint8  scalar_val = 0;
+    vx_scalar scalar;
+    int i;
+
+    for (i = 0; i < (PIPEUP_NUM_BUFS-1); i++)
+    {
+        copy_value[i] = 0;
+    }
+
+    pipeup_frame = 0;
+    global_value = 0;
+
+    ASSERT_VX_OBJECT(scalar = vxCreateScalar(context, VX_TYPE_UINT8, &scalar_val), VX_TYPE_SCALAR);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_NO_FAILURE(own_register_source1_kernel(context));
+    }
+    else
+    {
+        ASSERT_NO_FAILURE(own_register_source2_kernel(context));
+    }
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_VX_OBJECT(user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1_NAME), VX_TYPE_KERNEL);
+    }
+    else
+    {
+        ASSERT_VX_OBJECT(user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2_NAME), VX_TYPE_KERNEL);
+    }
+
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, user_kernel), VX_TYPE_NODE);
+
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)scalar));
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxEnableGraphStreaming(graph, node));
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+
+    is_pipeup_entered = vx_false_e;
+    is_steady_state_entered = vx_false_e;
+
+    VX_CALL(vxStartGraphStreaming(graph));
+
+    ct_delay_ms(arg_->stream_time);
+
+    VX_CALL(vxStopGraphStreaming(graph));
+
+    if (arg_->source == 1)
+    {
+        ASSERT(is_pipeup_entered == vx_true_e);
+        ASSERT(is_steady_state_entered == vx_true_e);
+    }
+
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    /* user kernel should be removed only after all references to it released */
+    /* Note, vxRemoveKernel doesn't zeroing kernel ref */
+    VX_CALL(vxRemoveKernel(user_kernel));
+
+    VX_CALL(vxReleaseScalar(&scalar));
+
+    ASSERT(node == 0);
+    ASSERT(graph == 0);
+    ASSERT(scalar == 0);
+}
+
+/*
+ *     node1      scalar      node2
+ * USER_SOURCE -- SCALAR -- USER_SINK
+ *
+ * Test case of a graph with a user source node outputting a scalar connected to a user sink node
+ * Two possible source kernels are used, one containing a pipeup loop and the other without pipeup
+ * In the case of a kernel with pipeup, a flag is checked whether or not the kernel entered the pipeup
+ * The scalar sources act as counters that increment the output upon each graph execution
+ * Error checking occurs in the sink node, as it expects the source node to increment the input to node
+ * Streaming is enabled on the graph.  Streaming starts then stops after a specified delay.
+ *
+ */
+TEST_WITH_ARG(GraphStreaming, testSourceSinkUserKernelStreaming, Arg, STREAMING_PARAMETERS)
+{
+    vx_graph graph;
+    vx_context context = context_->vx_context_;
+    vx_kernel source_user_kernel = 0, sink_user_kernel = 0;
+    vx_node node1 = 0, node2 = 0;
+    vx_uint8  scalar_val = 0;
+    vx_scalar scalar;
+    int i;
+
+    for (i = 0; i < (PIPEUP_NUM_BUFS-1); i++)
+    {
+        copy_value[i] = 0;
+    }
+
+    pipeup_frame = 0;
+    global_value = 0;
+    golden_sink_value = 0;
+
+    ASSERT_VX_OBJECT(scalar = vxCreateScalar(context, VX_TYPE_UINT8, &scalar_val), VX_TYPE_SCALAR);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_NO_FAILURE(own_register_source1_kernel(context));
+    }
+    else
+    {
+        ASSERT_NO_FAILURE(own_register_source2_kernel(context));
+    }
+
+    ASSERT_NO_FAILURE(own_register_sink_kernel(context));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    if (arg_->source == 1)
+    {
+        ASSERT_VX_OBJECT(source_user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE1_NAME), VX_TYPE_KERNEL);
+    }
+    else
+    {
+        ASSERT_VX_OBJECT(source_user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SOURCE2_NAME), VX_TYPE_KERNEL);
+    }
+
+    ASSERT_VX_OBJECT(sink_user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_USER_SINK_NAME), VX_TYPE_KERNEL);
+
+    ASSERT_VX_OBJECT(node1 = vxCreateGenericNode(graph, source_user_kernel), VX_TYPE_NODE);
+
+    ASSERT_VX_OBJECT(node2 = vxCreateGenericNode(graph, sink_user_kernel), VX_TYPE_NODE);
+
+    VX_CALL(vxSetParameterByIndex(node1, 0, (vx_reference)scalar));
+
+    VX_CALL(vxSetParameterByIndex(node2, 0, (vx_reference)scalar));
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxEnableGraphStreaming(graph, node1));
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+
+    is_pipeup_entered = vx_false_e;
+    is_steady_state_entered = vx_false_e;
+
+    VX_CALL(vxStartGraphStreaming(graph));
+
+    ct_delay_ms(arg_->stream_time);
+
+    VX_CALL(vxStopGraphStreaming(graph));
+
+    if (arg_->source == 1)
+    {
+        ASSERT(is_pipeup_entered == vx_true_e);
+        ASSERT(is_steady_state_entered == vx_true_e);
+    }
+
+    VX_CALL(vxReleaseNode(&node1));
+    VX_CALL(vxReleaseNode(&node2));
+    VX_CALL(vxReleaseGraph(&graph));
+
+    VX_CALL(vxRemoveKernel(source_user_kernel));
+    VX_CALL(vxRemoveKernel(sink_user_kernel));
+
+    VX_CALL(vxReleaseScalar(&scalar));
+
+    ASSERT(node1 == 0);
+    ASSERT(node2 == 0);
+    ASSERT(graph == 0);
+    ASSERT(scalar == 0);
+}
+
+TESTCASE_TESTS(GraphStreaming,
+               testSourceUserKernel,
+               testSourceSinkUserKernel,
+               testSourceUserKernelStreaming,
+               testSourceSinkUserKernelStreaming)
+
+#endif
diff --git a/test_conformance/test_halfscalegaussian.c b/test_conformance/test_halfscalegaussian.c
index 1181b7e..27291c9 100644
--- a/test_conformance/test_halfscalegaussian.c
+++ b/test_conformance/test_halfscalegaussian.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -320,3 +322,5 @@
         testNodeCreation,
         testGraphProcessing,
         testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_harriscorners.c b/test_conformance/test_harriscorners.c
index 5ad0f83..d118e4f 100644
--- a/test_conformance/test_harriscorners.c
+++ b/test_conformance/test_harriscorners.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -417,3 +419,5 @@
         testGraphProcessing,
         testImmediateProcessing
 )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_histogram.c b/test_conformance/test_histogram.c
index e2b0f68..9a352ec 100644
--- a/test_conformance/test_histogram.c
+++ b/test_conformance/test_histogram.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -228,8 +230,8 @@
                 CT_FAIL("check for query distribution attribute VX_DISTRIBUTION_BINS failed\n");
 
             VX_CALL(vxQueryDistribution(dist1, VX_DISTRIBUTION_WINDOW, &attr_window, sizeof(attr_window)));
-	    /*Tthe attribute is specified as valid only when the range is a multiple of nbins, 
-	     * in other cases, its value shouldn't be checked */
+        /*Tthe attribute is specified as valid only when the range is a multiple of nbins,
+         * in other cases, its value shouldn't be checked */
             if (((range % nbins) == 0) && (attr_window != reference_window(range, nbins)))
                 CT_FAIL("check for query distribution attribute VX_DISTRIBUTION_WINDOW failed\n");
 
@@ -305,3 +307,5 @@
 }
 
 TESTCASE_TESTS(Histogram, testOnRandom)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_hog.c b/test_conformance/test_hog.c
index 54676a8..542b05b 100644
--- a/test_conformance/test_hog.c
+++ b/test_conformance/test_hog.c
@@ -14,6 +14,8 @@
 * limitations under the License.
 */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include "test_engine/test.h"
 #include <math.h>
 #include <stdio.h>
@@ -48,7 +50,7 @@
 
     ASSERT_VX_OBJECT(input = vxCreateImage(context, src_width, src_height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(magnitudes = vxCreateTensor(context, 2, mag_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
-    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT8, 0), VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
 
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
     ASSERT_VX_OBJECT(node = vxHOGCellsNode(graph, input, cell_width, cell_height, num_bins, magnitudes, bins), VX_TYPE_NODE);
@@ -86,19 +88,28 @@
     vx_float32 orientation;
     vx_float32 magnitude;
     vx_int8 bin;
-    
+
     width = img->width;
     height = img->height;
-    vx_int16* mag_ref = (vx_int16 *)malloc(height / cell_height * width / cell_width * sizeof(vx_int16));
-    vx_int8* bins_ref = (vx_int8 *)malloc(height / cell_height * width / cell_width * bins_num );
-    vx_int16* mag = (vx_int16 *)malloc(height / cell_height * width / cell_width *sizeof(vx_int16));
-    vx_int8* bins_p = (vx_int8 *)malloc(height / cell_height * width / cell_width * bins_num);
+    vx_int16* mag_ref = (vx_int16 *)ct_alloc_mem(height / cell_height * width / cell_width * sizeof(vx_int16));
+    vx_int16* bins_ref = (vx_int16 *)ct_alloc_mem(height / cell_height * width / cell_width * bins_num * sizeof(vx_int16));
+    vx_int16* mag = (vx_int16 *)ct_alloc_mem(height / cell_height * width / cell_width *sizeof(vx_int16));
+    vx_int16* bins_p = (vx_int16 *)ct_alloc_mem(height / cell_height * width / cell_width * bins_num * sizeof(vx_int16));
     memset(mag_ref, 0, height / cell_height * width / cell_width * sizeof(vx_int16));
-    memset(bins_ref, 0, height / cell_height * width / cell_width * bins_num);
+    memset(bins_ref, 0, height / cell_height * width / cell_width * bins_num * sizeof(vx_int16));
     float num_div_360 = (float)bins_num / 360.0f;
 
-    vx_size magnitudes_dim_num = 2, magnitudes_dims[6] = { width/cell_width, height/cell_height,0 }, magnitudes_strides[6] = { 2, 2 * width / cell_width };
-    vx_size bins_dim_num = 3, bins_dims[6] = { width / cell_width, height / cell_height, bins_num }, bins_strides[6] = { 1,  width / cell_width, height / cell_height * width / cell_width };
+    vx_size magnitudes_dim_num = 2, magnitudes_dims[6] = { width/cell_width, height/cell_height,0 }, magnitudes_strides[6] = { 0 };
+    vx_size bins_dim_num = 3, bins_dims[6] = { width / cell_width, height / cell_height, bins_num }, bins_strides[6] = { 0 };
+    magnitudes_strides[0] = 2;
+    bins_strides[0] = 2;
+    for (vx_size i = 1; i < magnitudes_dim_num; i++) {
+        magnitudes_strides[i] = magnitudes_dims[i - 1] * magnitudes_strides[i - 1];
+    }
+    for (vx_size i = 1; i < bins_dim_num; i++) {
+        bins_strides[i] = bins_dims[i - 1] * bins_strides[i - 1];
+    }
+
     const size_t view_start[6] = { 0 };
     vxCopyTensorPatch(magnitudes, magnitudes_dim_num, view_start, magnitudes_dims, magnitudes_strides, mag, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
     vxCopyTensorPatch(bins, bins_dim_num, view_start, bins_dims, bins_strides, bins_p, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
@@ -160,11 +171,11 @@
             }
         }
     }
-    
-    free(mag_ref);
-    free(mag);
-    free(bins_ref);
-    free(bins_p);
+
+    ct_free_mem(mag_ref);
+    ct_free_mem(mag);
+    ct_free_mem(bins_ref);
+    ct_free_mem(bins_p);
     return status;
 }
 
@@ -214,8 +225,8 @@
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(magnitudes = vxCreateTensor(context, 2, mag_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
-    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT8, 0), VX_TYPE_TENSOR);
-    
+    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
+
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
     ASSERT_VX_OBJECT(node = vxHOGCellsNode(graph, src_image, cell_width, cell_height, bins_num, magnitudes, bins), VX_TYPE_NODE);
 
@@ -223,7 +234,7 @@
     VX_CALL(vxProcessGraph(graph));
 
     VX_CALL(status = hogcells_ref(src, cell_width, cell_height, bins_num, magnitudes, bins));
-    
+
     VX_CALL(vxReleaseNode(&node));
     VX_CALL(vxReleaseGraph(&graph));
     VX_CALL(vxReleaseImage(&src_image));
@@ -246,7 +257,7 @@
     vx_int32 cell_height = arg_->cell_height;
     vx_int32 bins_num = arg_->bins_num;
     CT_Image src = NULL;
-    vx_status status;
+    vx_status status = VX_SUCCESS;
 
     vx_uint32 src_width;
     vx_uint32 src_height;
@@ -262,10 +273,11 @@
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(magnitudes = vxCreateTensor(context, 2, mag_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
-    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT8, 0), VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
 
     VX_CALL(vxuHOGCells(context, src_image, cell_width, cell_width, bins_num, magnitudes, bins));
     ASSERT_NO_FAILURE(status = hogcells_ref(src, cell_width, cell_height, bins_num, magnitudes, bins));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, status);
 
     VX_CALL(vxReleaseImage(&src_image));
     VX_CALL(vxReleaseTensor(&magnitudes));
@@ -301,17 +313,24 @@
     vx_node feature_node = 0;
     params.window_width = 64;
     params.window_height = 32;
+    params.window_stride = 64;
     params.block_width = 16;
     params.block_height = 16;
+    params.block_stride = 16;
     params.cell_width = 8;
     params.cell_height = 8;
     params.num_bins = 9;
+    const vx_size features_dims[3] = { (src_width - params.window_width) / params.window_stride + 1,
+        (src_height - params.window_height) / params.window_stride + 1,
+        ((params.window_width - params.block_width) / params.block_stride + 1) *
+        ((src_height - params.block_height) / params.block_stride + 1) *
+        ((params.block_width * params.block_height) / (params.cell_width * params.cell_height)) * num_bins };
     ASSERT_VX_OBJECT(input = vxCreateImage(context, src_width, src_height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(magnitudes = vxCreateTensor(context, 2, mag_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
-    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT8, 0), VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
     ASSERT_VX_OBJECT(cell_node = vxHOGCellsNode(graph, input, cell_width, cell_height, num_bins, magnitudes, bins), VX_TYPE_NODE);
-    ASSERT_VX_OBJECT(features = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(features = vxCreateTensor(context, 3, features_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
 
     ASSERT_VX_OBJECT(feature_node = vxHOGFeaturesNode(graph, input, magnitudes, bins, &params, 1, features), VX_TYPE_NODE);
     VX_CALL(vxVerifyGraph(graph));
@@ -353,19 +372,18 @@
     vx_int32 num_windowsH = height / params.window_height;
     vx_int32 num_blockW = width / params.cell_width - 1;
     vx_int32 num_blockH = height / params.cell_height - 1;
-    vx_int32 num_block = num_blockW * num_blockH;
     vx_int32 n_cellsx = width / cell_width;
     vx_int32 cells_per_block_w = params.block_width / cell_width;
     vx_int32 cells_per_block_h = params.block_height / cell_height;
-   
-    vx_int16* mag_ref = (vx_int16 *)malloc(height / cell_height * width / cell_width * sizeof(vx_int16));
-    vx_int8* bins_ref = (vx_int8 *)malloc(height / cell_height * width / cell_width * bins_num );
-    vx_int16* features_ref = (vx_int16 *)malloc(num_windowsW * num_windowsH * params.window_width / params.block_stride * 
+
+    vx_int16* mag_ref = (vx_int16 *)ct_alloc_mem(height / cell_height * width / cell_width * sizeof(vx_int16));
+    vx_int16* bins_ref = (vx_int16 *)ct_alloc_mem(height / cell_height * width / cell_width * bins_num * sizeof(vx_int16));
+    vx_int16* features_ref = (vx_int16 *)ct_alloc_mem(num_windowsW * num_windowsH * params.window_width / params.block_stride *
                                                 params.window_height / params.block_stride *bins_num * sizeof(vx_int16));
-    vx_int16* features_p = (vx_int16 *)malloc(num_windowsW * num_windowsH * params.window_width / params.block_stride *
+    vx_int16* features_p = (vx_int16 *)ct_alloc_mem(num_windowsW * num_windowsH * params.window_width / params.block_stride *
                                               params.window_height / params.block_stride *bins_num * sizeof(vx_int16));
     memset(mag_ref, 0, height / cell_height * width / cell_width * sizeof(vx_int16));
-    memset(bins_ref, 0, height / cell_height * width / cell_width * bins_num);
+    memset(bins_ref, 0, height / cell_height * width / cell_width * bins_num * sizeof(vx_int16));
     memset(features_ref, 0, num_windowsW * num_windowsH * params.window_width / params.block_stride *
         params.window_height / params.block_stride *bins_num * sizeof(vx_int16));
 
@@ -451,11 +469,11 @@
             break;
         }
     }
-    
-    free(mag_ref);
-    free(bins_ref);
-    free(features_ref);
-    free(features_p);
+
+    ct_free_mem(mag_ref);
+    ct_free_mem(bins_ref);
+    ct_free_mem(features_ref);
+    ct_free_mem(features_p);
     return status;
 }
 
@@ -499,15 +517,18 @@
 
     const vx_size mag_dims[2] = { src_width / cell_width, src_height / cell_height };
     const vx_size bins_dims[3] = { src_width / cell_width, src_height / cell_height, bins_num };
-    const vx_size features_dims[3] = { src_width / arg_->hog_params.window_stride,  src_height / arg_->hog_params.window_stride, 
-                                       arg_->hog_params.window_width / arg_->hog_params.block_stride * arg_->hog_params.window_height / arg_->hog_params.block_stride *bins_num };
+    const vx_size features_dims[3] = { (src_width - arg_->hog_params.window_width) / arg_->hog_params.window_stride + 1,
+        (src_height - arg_->hog_params.window_height) / arg_->hog_params.window_stride + 1,
+        ((arg_->hog_params.window_width - arg_->hog_params.block_width) / arg_->hog_params.block_stride + 1) *
+        ((src_height - arg_->hog_params.block_height) / arg_->hog_params.block_stride + 1) *
+        ((arg_->hog_params.block_width * arg_->hog_params.block_height) / (arg_->hog_params.cell_width * arg_->hog_params.cell_height)) * bins_num };
     vx_tensor magnitudes;
     vx_tensor bins;
     vx_tensor features;
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(magnitudes = vxCreateTensor(context, 2, mag_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
-    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT8, 0), VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
     ASSERT_VX_OBJECT(features = vxCreateTensor(context, 3, features_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
 
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
@@ -517,7 +538,7 @@
     VX_CALL(vxProcessGraph(graph));
 
     VX_CALL(status = hogfeatures_ref(src, arg_->hog_params, features));
-    
+
     VX_CALL(vxReleaseNode(&cell_node));
     VX_CALL(vxReleaseNode(&feature_node));
     VX_CALL(vxReleaseGraph(&graph));
@@ -538,14 +559,11 @@
 {
     vx_context context = context_->vx_context_;
     vx_image src_image = 0;
-    vx_graph graph = 0;
-    vx_node cell_node = 0;
-    vx_node feature_node = 0;
     vx_int32 cell_width = arg_->hog_params.cell_width;
     vx_int32 cell_height = arg_->hog_params.cell_height;
     vx_int32 bins_num = arg_->hog_params.num_bins;
     CT_Image src = NULL;
-    vx_status status;
+    vx_status status = VX_SUCCESS;
 
     vx_uint32 src_width;
     vx_uint32 src_height;
@@ -556,20 +574,24 @@
 
     const vx_size mag_dims[2] = { src_width / cell_width, src_height / cell_height };
     const vx_size bins_dims[3] = { src_width / cell_width, src_height / cell_height, bins_num };
-    const vx_size features_dims[3] = { src_width / arg_->hog_params.window_stride,  src_height / arg_->hog_params.window_stride,
-        arg_->hog_params.window_width / arg_->hog_params.block_stride * arg_->hog_params.window_height / arg_->hog_params.block_stride *bins_num };
+    const vx_size features_dims[3] = { (src_width - arg_->hog_params.window_width) / arg_->hog_params.window_stride + 1,
+        (src_height - arg_->hog_params.window_height) / arg_->hog_params.window_stride + 1,
+        ((arg_->hog_params.window_width - arg_->hog_params.block_width) / arg_->hog_params.block_stride + 1) *
+        ((src_height - arg_->hog_params.block_height) / arg_->hog_params.block_stride + 1) *
+        ((arg_->hog_params.block_width * arg_->hog_params.block_height) / (arg_->hog_params.cell_width * arg_->hog_params.cell_height)) * bins_num };
     vx_tensor magnitudes;
     vx_tensor bins;
     vx_tensor features;
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(magnitudes = vxCreateTensor(context, 2, mag_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
-    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT8, 0), VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(bins = vxCreateTensor(context, 3, bins_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
     ASSERT_VX_OBJECT(features = vxCreateTensor(context, 3, features_dims, VX_TYPE_INT16, 8), VX_TYPE_TENSOR);
 
     VX_CALL(vxuHOGCells(context, src_image, cell_width, cell_width, bins_num, magnitudes, bins));
     VX_CALL(vxuHOGFeatures(context, src_image, magnitudes, bins, &arg_->hog_params, 1, features));
     ASSERT_NO_FAILURE(status = hogfeatures_ref(src, arg_->hog_params, features));
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, status);
 
     VX_CALL(vxReleaseImage(&src_image));
     VX_CALL(vxReleaseTensor(&magnitudes));
@@ -582,3 +604,5 @@
                testNodeCreation,
                testGraphProcessing,
                testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_houghlinesp.c b/test_conformance/test_houghlinesp.c
index 0d13bf0..3a3f663 100644
--- a/test_conformance/test_houghlinesp.c
+++ b/test_conformance/test_houghlinesp.c
@@ -15,6 +15,8 @@
  * limitations under the License.
 */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include "test_engine/test.h"
 
 #include <stdint.h>
@@ -36,7 +38,7 @@
     vx_array lines_array = 0;
     vx_scalar num_lines = 0;
     vx_uint32 numlines = 0;
-    vx_hough_lines_p_t param_hough_lines = {1, 180, 50, 50, 10, M_PI, 0};
+    vx_hough_lines_p_t param_hough_lines = {1, M_PI/180, 50, 50, 10, M_PI, 0};
 
     vx_graph graph = 0;
     vx_node node = 0;
@@ -50,7 +52,7 @@
 
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
     ASSERT_VX_OBJECT(node = vxHoughLinesPNode(graph, input, &param_hough_lines, lines_array, num_lines), VX_TYPE_NODE);
-    
+
     VX_CALL(vxVerifyGraph(graph));
     VX_CALL(vxProcessGraph(graph));
 
@@ -67,14 +69,31 @@
     ASSERT(input == 0);
 }
 
-static CT_Image hough_lines_read_image(const char *fileName, int width, int height)
+static CT_Image hough_lines_read_image(const char *fileName, int width, int height, vx_df_image format)
 {
-    CT_Image image = NULL;
+    CT_Image image_load = NULL, image_ret = NULL;
     ASSERT_(return 0, width == 0 && height == 0);
-    image = ct_read_image(fileName, 1);
-    ASSERT_(return 0, image);
-    ASSERT_(return 0, image->format == VX_DF_IMAGE_U8);
-    return image;
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    image_load = ct_read_image(fileName, 1);
+    ASSERT_(return 0, image_load);
+    ASSERT_(return 0, image_load->format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+    {
+        ASSERT_NO_FAILURE_(return 0, threshold_U8_ct_image(image_load, 127));   // Threshold to make the U1 image less trivial
+        ASSERT_NO_FAILURE_(return 0, image_ret = ct_allocate_image(image_load->width, image_load->height, VX_DF_IMAGE_U1));
+        ASSERT_NO_FAILURE_(return 0, U8_ct_image_to_U1_ct_image(image_load, image_ret));
+    }
+    else
+    {
+        image_ret = image_load;
+    }
+
+    ASSERT_(return 0, image_ret);
+    ASSERT_(return 0, image_ret->format == format);
+
+    return image_ret;
 }
 
 static vx_bool similar_lines(vx_line2d_t act, vx_line2d_t exp, vx_float32 eps)
@@ -115,6 +134,7 @@
         return vx_false_e;
     }
 }
+
 static vx_status countLine2dIntersection(const vx_line2d_t *expect_lines, const vx_line2d_t *actual_lines, vx_int32 exp_lines_num, vx_int32 actual_lines_num, vx_float32 eps)
 {
     vx_status status = VX_FAILURE;
@@ -169,14 +189,13 @@
     vxMapArrayRange(lines_array, 0, lines_array_length, &lines_array_map_id, &lines_array_stride, &lines_array_ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X);
     vx_line2d_t *lines_array_p = (vx_line2d_t *)lines_array_ptr;
     vx_line2d_t *exp_lines = 0;
-    ASSERT_(return VX_FAILURE, exp_lines = ct_alloc_mem(sizeof(vx_line2d_t) * MAX_NUM_EXP_LINES));
+    ASSERT_(return VX_FAILURE, exp_lines = (vx_line2d_t *)ct_alloc_mem(sizeof(vx_line2d_t) * MAX_NUM_EXP_LINES));
 
     vx_int32 id = 0;
-    char * pos = buf;
+    char * pos = (char *)buf;
     char * next = 0;
     while (pos && (next = strchr(pos, '\n')))
     {
-        
         vx_float32 x1, y1, x2, y2;
         vx_int32 line_id;
 
@@ -197,18 +216,25 @@
 
 typedef struct {
     const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height);
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     vx_hough_lines_p_t param_hough_lines;
     const char* result_filename;
+    vx_df_image format;
 } Arg;
 
 #define PARAMETERS \
-    ARG("case1_1_180_50_50_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 50, 50, 10, M_PI, 0}, "hough_lines_1_180_50_50_10.txt"), \
-    ARG("case1_1_170_40_40_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/170, 40, 40, 10, M_PI, 0}, "hough_lines_1_170_40_40_10.txt"), \
-    ARG("case1_1_180_40_40_9_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 40, 40, 9, M_PI, 0}, "hough_lines_1_180_40_40_9.txt"), \
-    ARG("case1_2_180_50_50_9_HoughLines", hough_lines_read_image, "hough_lines.bmp", {2, M_PI/180, 50, 50, 9, M_PI, 0}, "hough_lines_2_180_50_50_9.txt"), \
-    ARG("case1_1_190_40_40_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/190, 40, 40, 10, M_PI, 0}, "hough_lines_1_190_40_40_10.txt"), \
+    ARG("case1_1_180_50_50_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 50, 50, 10, M_PI, 0}, "hough_lines_1_180_50_50_10.txt", VX_DF_IMAGE_U8), \
+    ARG("case1_1_170_40_40_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/170, 40, 40, 10, M_PI, 0}, "hough_lines_1_170_40_40_10.txt", VX_DF_IMAGE_U8), \
+    ARG("case1_1_180_40_40_9_HoughLines",  hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 40, 40, 9,  M_PI, 0}, "hough_lines_1_180_40_40_9.txt",  VX_DF_IMAGE_U8), \
+    ARG("case1_2_180_50_50_9_HoughLines",  hough_lines_read_image, "hough_lines.bmp", {2, M_PI/180, 50, 50, 9,  M_PI, 0}, "hough_lines_2_180_50_50_9.txt",  VX_DF_IMAGE_U8), \
+    ARG("case1_1_190_40_40_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/190, 40, 40, 10, M_PI, 0}, "hough_lines_1_190_40_40_10.txt", VX_DF_IMAGE_U8), \
+    \
+    ARG("_U1_/case1_1_180_50_50_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 50, 50, 10, M_PI, 0}, "hough_lines_1_180_50_50_10.txt", VX_DF_IMAGE_U1), \
+    ARG("_U1_/case1_1_170_40_40_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/170, 40, 40, 10, M_PI, 0}, "hough_lines_1_170_40_40_10.txt", VX_DF_IMAGE_U1), \
+    ARG("_U1_/case1_1_180_40_40_9_HoughLines",  hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 40, 40, 9,  M_PI, 0}, "hough_lines_1_180_40_40_9.txt",  VX_DF_IMAGE_U1), \
+    ARG("_U1_/case1_2_180_50_50_9_HoughLines",  hough_lines_read_image, "hough_lines.bmp", {2, M_PI/180, 50, 50, 9,  M_PI, 0}, "hough_lines_2_180_50_50_9.txt",  VX_DF_IMAGE_U1), \
+    ARG("_U1_/case1_1_190_40_40_10_HoughLines", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/190, 40, 40, 10, M_PI, 0}, "hough_lines_1_190_40_40_10.txt", VX_DF_IMAGE_U1) \
 
 TEST_WITH_ARG(Houghlinesp, testGraphProcessing, Arg,
     PARAMETERS
@@ -228,8 +254,8 @@
     vx_uint32 src_width;
     vx_uint32 src_height;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, 0, 0));
-    
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, 0, 0, arg_->format));
+
     src_width = src->width;
     src_height = src->height;
 
@@ -279,7 +305,7 @@
     vx_uint32 src_width;
     vx_uint32 src_height;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, 0, 0));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, 0, 0, arg_->format));
 
     src_width = src->width;
     src_height = src->height;
@@ -302,7 +328,80 @@
     ASSERT(src_image == 0);
 }
 
-TESTCASE_TESTS(Houghlinesp, 
-               testNodeCreation, 
-               testGraphProcessing, 
-               testImmediateProcessing)
+typedef struct {
+    const char* testName;
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    vx_hough_lines_p_t param_hough_lines;
+    const char* result_filename;
+    vx_df_image format;
+    vx_rectangle_t region_shift;
+} ValidRegionTest_Arg;
+
+#define REGION_PARAMETERS \
+    ARG("case1_1_180_50_50_10_HoughLines_RegionShrink=1", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 50, 50, 10, M_PI, 0}, "hough_lines_1_180_50_50_10.txt", VX_DF_IMAGE_U8, {1, 1, -1, -1}), \
+    ARG("case1_2_180_50_50_9_HoughLines_RegionShrink=1",  hough_lines_read_image, "hough_lines.bmp", {2, M_PI/180, 50, 50, 9,  M_PI, 0}, "hough_lines_2_180_50_50_9.txt",  VX_DF_IMAGE_U8, {1, 1, -1, -1}), \
+    ARG("case1_1_180_50_50_10_HoughLines_RegionShrink=7", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 50, 50, 10, M_PI, 0}, "hough_lines_1_180_50_50_10.txt", VX_DF_IMAGE_U8, {7, 7, -7, -7}), \
+    ARG("case1_2_180_50_50_9_HoughLines_RegionShrink=7",  hough_lines_read_image, "hough_lines.bmp", {2, M_PI/180, 50, 50, 9,  M_PI, 0}, "hough_lines_2_180_50_50_9.txt",  VX_DF_IMAGE_U8, {7, 7, -7, -7}), \
+    \
+    ARG("_U1_/case1_1_180_50_50_10_HoughLines_RegionShrink=1", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 50, 50, 10, M_PI, 0}, "hough_lines_1_180_50_50_10.txt", VX_DF_IMAGE_U1, {1, 1, -1, -1}), \
+    ARG("_U1_/case1_2_180_50_50_9_HoughLines_RegionShrink=1",  hough_lines_read_image, "hough_lines.bmp", {2, M_PI/180, 50, 50, 9,  M_PI, 0}, "hough_lines_2_180_50_50_9.txt",  VX_DF_IMAGE_U1, {1, 1, -1, -1}), \
+    ARG("_U1_/case1_1_180_50_50_10_HoughLines_RegionShrink=7", hough_lines_read_image, "hough_lines.bmp", {1, M_PI/180, 50, 50, 10, M_PI, 0}, "hough_lines_1_180_50_50_10.txt", VX_DF_IMAGE_U1, {7, 7, -7, -7}), \
+    ARG("_U1_/case1_2_180_50_50_9_HoughLines_RegionShrink=7",  hough_lines_read_image, "hough_lines.bmp", {2, M_PI/180, 50, 50, 9,  M_PI, 0}, "hough_lines_2_180_50_50_9.txt",  VX_DF_IMAGE_U1, {7, 7, -7, -7}) \
+
+// For small valid region shrinks (like the ones in these tests) the already existing reference output line lists
+// still apply because the objects in hough_lines.bmp are fairly centered in the image and far from the edges
+TEST_WITH_ARG(Houghlinesp, testWithValidRegion, ValidRegionTest_Arg,
+    REGION_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0;
+
+    CT_Image src = NULL;
+    vx_uint32 src_width;
+    vx_uint32 src_height;
+
+    vx_array lines_array = 0;
+    vx_scalar num_lines = 0;
+    vx_uint32 numlines = 0;
+
+    vx_hough_lines_p_t param_lines_p = arg_->param_hough_lines;
+    vx_status status;
+
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->region_shift;
+
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, 0, 0, arg_->format));
+
+    src_width = src->width;
+    src_height = src->height;
+
+    ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(lines_array = vxCreateArray(context, VX_TYPE_LINE_2D, src_width * src_height * sizeof(vx_line2d_t)), VX_TYPE_ARRAY);
+    ASSERT_VX_OBJECT(num_lines = vxCreateScalar(context, VX_TYPE_SIZE, &numlines), VX_TYPE_SCALAR);
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(src_image, &rect));
+    ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(src_image, &rect));
+
+    VX_CALL(vxuHoughLinesP(context, src_image, &param_lines_p, lines_array, num_lines));
+
+    ASSERT_NO_FAILURE(status = houghlinesp_check(lines_array, num_lines, arg_->result_filename));
+    ASSERT(status == VX_SUCCESS);
+
+    VX_CALL(vxReleaseArray(&lines_array));
+    VX_CALL(vxReleaseScalar(&num_lines));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(lines_array == 0);
+    ASSERT(num_lines == 0);
+    ASSERT(src_image == 0);
+}
+
+TESTCASE_TESTS(Houghlinesp,
+               testNodeCreation,
+               testGraphProcessing,
+               testImmediateProcessing,
+               testWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_integral.c b/test_conformance/test_integral.c
index 3c587f4..179eb15 100644
--- a/test_conformance/test_integral.c
+++ b/test_conformance/test_integral.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -192,3 +194,5 @@
 }
 
 TESTCASE_TESTS(Integral, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_laplacianpyramid.c b/test_conformance/test_laplacianpyramid.c
index 1130214..a97e282 100644
--- a/test_conformance/test_laplacianpyramid.c
+++ b/test_conformance/test_laplacianpyramid.c
@@ -15,19 +15,19 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <math.h>
 #include <string.h>
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
 #include "test_engine/test.h"
-#include "shared_functions.h"
 
 #define VX_GAUSSIAN_PYRAMID_TOLERANCE 1
 
 TESTCASE(LaplacianPyramid, CT_VXContext, ct_setup_vx_context, 0)
 
-
 TEST(LaplacianPyramid, testNodeCreation)
 {
     vx_context context = context_->vx_context_;
@@ -416,6 +416,9 @@
     vx_status status = VX_SUCCESS;
     vx_int32 low_x, low_y, high_x, high_y;
 
+    vx_map_id src_map_id;
+    vx_map_id dst_map_id;
+
     status |= vxQueryImage(src, VX_IMAGE_FORMAT, &src_format, sizeof(src_format));
     status |= vxQueryImage(dst, VX_IMAGE_FORMAT, &dst_format, sizeof(dst_format));
     status |= vxQueryConvolution(conv, VX_CONVOLUTION_COLUMNS, &conv_width, sizeof(conv_width));
@@ -425,8 +428,10 @@
     conv_radius_y = (vx_int32)conv_height / 2;
     status |= vxCopyConvolutionCoefficients(conv, conv_mat, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
     status |= vxGetValidRegionImage(src, &rect);
-    status |= vxAccessImagePatch(src, &rect, 0, &src_addr, &src_base, VX_READ_ONLY);
-    status |= vxAccessImagePatch(dst, &rect, 0, &dst_addr, &dst_base, VX_WRITE_ONLY);
+    status |= vxMapImagePatch(src, &rect, 0, &src_map_id, &src_addr, (void **)&src_base,
+                              VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0);
+    status |= vxMapImagePatch(dst, &rect, 0, &dst_map_id, &dst_addr, (void **)&dst_base,
+                              VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0);
 
     low_x = 0;
     high_x = src_addr.dim_x;
@@ -515,8 +520,8 @@
         }
     }
 
-    status |= vxCommitImagePatch(src, NULL, 0, &src_addr, src_base);
-    status |= vxCommitImagePatch(dst, &rect, 0, &dst_addr, dst_base);
+    status |= vxUnmapImagePatch(src, src_map_id);
+    status |= vxUnmapImagePatch(dst, dst_map_id);
 
     return status;
 }
@@ -636,7 +641,7 @@
     vx_convolution conv = 0;
 
     border.mode = VX_BORDER_REPLICATE;
-    
+
     VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
 
     VX_CALL(vxQueryPyramid(laplacian, VX_PYRAMID_LEVELS, &levels, sizeof(levels)));
@@ -862,9 +867,9 @@
     }
 
     own_laplacian_pyramid_reference(context, border, src, ref_pyr, ref_dst);
-    
+
     border.mode = VX_BORDER_REPLICATE;
-    
+
     VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
     VX_CALL(vxuLaplacianPyramid(context, src, tst_pyr, tst_dst));
 
@@ -1198,3 +1203,5 @@
     testGraphProcessing,
     testImmediateProcessing
 )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_lbp.c b/test_conformance/test_lbp.c
index fcf1f6a..62b6bc7 100644
--- a/test_conformance/test_lbp.c
+++ b/test_conformance/test_lbp.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include <math.h>
 #include <float.h>
 #include <string.h>
@@ -158,3 +160,5 @@
 }
 
 TESTCASE_TESTS(LBP, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_logging.c b/test_conformance/test_logging.c
index 67a32b8..148d237 100644
--- a/test_conformance/test_logging.c
+++ b/test_conformance/test_logging.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -31,42 +31,42 @@
 
 TEST(Logging, Cummulative)
 {
-    vx_image image = 0;
+    vx_graph graph = 0;
     vx_context context = vxCreateContext();
 
     ASSERT_VX_OBJECT(context, VX_TYPE_CONTEXT);
     CT_RegisterForGarbageCollection(context, ct_destroy_vx_context, CT_GC_OBJECT);
-    ASSERT_VX_OBJECT(image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
 
     // normall logging
     vxRegisterLogCallback(context, test_log_callback, vx_false_e);
     log_callback_is_called = vx_false_e;
-    vxAddLogEntry((vx_reference)image, VX_FAILURE, "hello world", 1, 2, 3);
+    vxAddLogEntry((vx_reference)graph, VX_FAILURE, "hello world", 1, 2, 3);
     ASSERT(log_callback_is_called);
 
     // clear callback
     vxRegisterLogCallback(context, NULL, vx_true_e);
     log_callback_is_called = vx_false_e;
-    vxAddLogEntry((vx_reference)image, VX_FAILURE, "hello world", 4, 5, 6);
+    vxAddLogEntry((vx_reference)graph, VX_FAILURE, "hello world", 4, 5, 6);
     ASSERT(!log_callback_is_called);
 
     // restore callback
     vxRegisterLogCallback(context, test_log_callback, vx_true_e);
 
     // disable logs for image
-    VX_CALL(vxDirective((vx_reference)image, VX_DIRECTIVE_DISABLE_LOGGING));
+    VX_CALL(vxDirective((vx_reference)graph, VX_DIRECTIVE_DISABLE_LOGGING));
     log_callback_is_called = vx_false_e;
-    vxAddLogEntry((vx_reference)image, VX_FAILURE, "hello world", 4, 5, 6);
+    vxAddLogEntry((vx_reference)graph, VX_FAILURE, "hello world", 4, 5, 6);
     ASSERT(!log_callback_is_called);
 
     // turn on logs once again
-    VX_CALL(vxDirective((vx_reference)image, VX_DIRECTIVE_ENABLE_LOGGING));
+    VX_CALL(vxDirective((vx_reference)graph, VX_DIRECTIVE_ENABLE_LOGGING));
     log_callback_is_called = vx_false_e;
-    vxAddLogEntry((vx_reference)image, VX_FAILURE, "%*s", VX_MAX_LOG_MESSAGE_LEN + 20, ""); // 20 symbols longer string than limit
+    vxAddLogEntry((vx_reference)graph, VX_FAILURE, "%*s", VX_MAX_LOG_MESSAGE_LEN + 20, ""); // 20 symbols longer string than limit
     ASSERT(log_callback_is_called);
 
-    VX_CALL(vxReleaseImage(&image));
-    ASSERT(image == 0);
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT(graph == 0);
 }
 
 
diff --git a/test_conformance/test_lut.c b/test_conformance/test_lut.c
index 364d5d4..9965c3b 100644
--- a/test_conformance/test_lut.c
+++ b/test_conformance/test_lut.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -637,3 +639,5 @@
                testImmediateProcessing,
                test_vxCopyLUT,
                test_vxMapLUTWrite)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_magnitude.c b/test_conformance/test_magnitude.c
index 2dfaace..5d9c7f1 100644
--- a/test_conformance/test_magnitude.c
+++ b/test_conformance/test_magnitude.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -209,3 +211,5 @@
 }
 
 TESTCASE_TESTS(Magnitude, testOnRandom)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_main.h b/test_conformance/test_main.h
index b9aaf88..1b0e8fa 100644
--- a/test_conformance/test_main.h
+++ b/test_conformance/test_main.h
@@ -15,6 +15,13 @@
  * limitations under the License.
  */
 
+/* Base Feature Set Tests (for all conformance feature sets) */
+TESTCASE(GraphBase)
+TESTCASE(Logging)
+TESTCASE(SmokeTestBase)
+TESTCASE(TargetBase)
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
 TESTCASE(Graph)
 TESTCASE(GraphCallback)
 TESTCASE(GraphDelay)
@@ -23,26 +30,34 @@
 TESTCASE(Array)
 TESTCASE(ObjectArray)
 TESTCASE(Image)
-
 TESTCASE(vxCreateImageFromChannel)
-
 TESTCASE(vxCopyImagePatch)
 TESTCASE(vxMapImagePatch)
+TESTCASE(Distribution)
 
+TESTCASE(vxCopyRemapPatch)
+TESTCASE(vxMapRemapPatch)
+
+TESTCASE(UserNode)
+TESTCASE(SmokeTest)
+TESTCASE(Target)
+TESTCASE(Convolution)
+TESTCASE(Matrix)
 TESTCASE(vxuConvertDepth)
 TESTCASE(vxConvertDepth)
-
 TESTCASE(ChannelCombine)
 TESTCASE(ChannelExtract)
-
 TESTCASE(ColorConvert)
-TESTCASE(Distribution)
 TESTCASE(vxuAddSub)
 TESTCASE(vxAddSub)
-
 TESTCASE(vxuNot)
 TESTCASE(vxNot)
 
+#ifdef OPENVX_USE_U1
+TESTCASE(vxuBinOp1u)
+TESTCASE(vxBinOp1u)
+#endif
+
 TESTCASE(vxuBinOp8u)
 TESTCASE(vxBinOp8u)
 
@@ -51,96 +66,99 @@
 
 TESTCASE(vxuMultiply)
 TESTCASE(vxMultiply)
-
 TESTCASE(Histogram)
 TESTCASE(EqualizeHistogram)
 TESTCASE(MeanStdDev)
 TESTCASE(MinMaxLoc)
-TESTCASE(Min)
-TESTCASE(Max)
-TESTCASE(Threshold)
 
+TESTCASE(WeightedAverage)
+TESTCASE(Threshold)
 TESTCASE(Box3x3)
 TESTCASE(Convolve)
 TESTCASE(Dilate3x3)
 TESTCASE(Erode3x3)
+
 TESTCASE(Gaussian3x3)
 TESTCASE(Median3x3)
 TESTCASE(Sobel3x3)
 TESTCASE(NonLinearFilter)
-
-TESTCASE(Accumulate)
-TESTCASE(AccumulateSquare)
-TESTCASE(AccumulateWeighted)
-
 TESTCASE(Integral)
-TESTCASE(LUT)
 
 TESTCASE(Magnitude)
 TESTCASE(Phase)
-
 TESTCASE(FastCorners)
 TESTCASE(HarrisCorners)
-
 TESTCASE(Scale)
 TESTCASE(WarpAffine)
 TESTCASE(WarpPerspective)
 TESTCASE(Remap)
-TESTCASE(vxCopyRemapPatch)
-TESTCASE(vxMapRemapPatch)
-
+TESTCASE(Scalar)
 
 TESTCASE(GaussianPyramid)
 TESTCASE(HalfScaleGaussian)
-
 TESTCASE(LaplacianPyramid)
 TESTCASE(LaplacianReconstruct)
-
 TESTCASE(vxuCanny)
 TESTCASE(vxCanny)
 TESTCASE(OptFlowPyrLK)
+TESTCASE(LUT)
+#endif
 
-TESTCASE(UserNode)
-
-TESTCASE(Logging)
-TESTCASE(SmokeTest)
-
-TESTCASE(Scalar)
-
-TESTCASE(Target)
-
-TESTCASE(Convolution)
-TESTCASE(Matrix)
-
+#ifdef OPENVX_USE_ENHANCED_VISION
+TESTCASE(GraphEnhanced)
+TESTCASE(GraphDelayTensor)
+TESTCASE(Min)
+TESTCASE(Max)
 TESTCASE(Nonmaxsuppression)
-
 TESTCASE(TensorOp)
-
 TESTCASE(LBP)
-
 TESTCASE(BilateralFilter)
-
 TESTCASE(MatchTemplate)
-
 TESTCASE(Houghlinesp)
-
 TESTCASE(Copy)
-
 TESTCASE(HogCells)
 TESTCASE(HogFeatures)
-
 TESTCASE(ControlFlow)
+TESTCASE(TensorEnhanced)
+#endif
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_NEURAL_NETWORKS || OPENVX_CONFORMANCE_NNEF_IMPORT
+TESTCASE(Tensor)
+#endif
+
+#if defined OPENVX_CONFORMANCE_NEURAL_NETWORKS || OPENVX_CONFORMANCE_NNEF_IMPORT
+TESTCASE(VxKernelOfNNAndNNEF)
+TESTCASE(VxParameterOfNNAndNNEF)
+TESTCASE(UserKernelsOfNNAndNNEF)
+TESTCASE(MetaFormatOfNNAndNNEF)
+#endif
 
 #ifdef OPENVX_USE_IX
 TESTCASE(ExtensionObject)
 #endif
 
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
 #ifdef OPENVX_USE_NN
 TESTCASE(TensorNN)
 #endif
-
 #ifdef OPENVX_USE_NN_16
 TESTCASE(TensorNetworks)
 #endif
+#endif
 
+#ifdef OPENVX_CONFORMANCE_NNEF_IMPORT
+TESTCASE(TensorNNEFImport)
+#endif
+
+#ifdef OPENVX_USE_PIPELINING
+TESTCASE(GraphPipeline)
+#endif
+
+#ifdef OPENVX_USE_STREAMING
+TESTCASE(GraphStreaming)
+#endif
+
+#ifdef OPENVX_USE_USER_DATA_OBJECT
+TESTCASE(UserDataObject)
+#endif
 
diff --git a/test_conformance/test_matchtemplate.c b/test_conformance/test_matchtemplate.c
index 9f35040..fd7aa4a 100644
--- a/test_conformance/test_matchtemplate.c
+++ b/test_conformance/test_matchtemplate.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -219,3 +221,5 @@
     ASSERT(vx_result_image == 0);}
 
 TESTCASE_TESTS(MatchTemplate, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_matrix.c b/test_conformance/test_matrix.c
index ade4a82..f29d39e 100644
--- a/test_conformance/test_matrix.c
+++ b/test_conformance/test_matrix.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -208,3 +210,6 @@
 
 
 TESTCASE_TESTS(Matrix, test_vxCreateMatrix, test_vxCreateVirtualMatrix, test_vxCreateMatrixFromPatternAndOrigin, test_vxCopyMatrix, test_vxQueryMatrix)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
diff --git a/test_conformance/test_max.c b/test_conformance/test_max.c
index 8c1318e..d409d9a 100644
--- a/test_conformance/test_max.c
+++ b/test_conformance/test_max.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include <string.h>
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -180,3 +182,5 @@
 
 }
 TESTCASE_TESTS(Max, testvxMax)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_meanstddev.c b/test_conformance/test_meanstddev.c
index bbf2c2b..3a25bc4 100644
--- a/test_conformance/test_meanstddev.c
+++ b/test_conformance/test_meanstddev.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <math.h>
 #include <stdlib.h>
 #include <limits.h>
@@ -26,47 +28,59 @@
 
 static void reference_mean_stddev(CT_Image src, vx_float32* _mean, vx_float32* _stddev)
 {
-    uint32_t x, y, width = src ? src->width : 0, height = src ? src->height : 0;
-    uint32_t npix, stride;
-    double sum = 0, sqsum = 0;
-    int format = src ? src->format : VX_DF_IMAGE_U8;
-
     ASSERT(src);
     ASSERT(src->width > 0 && src->height > 0);
-    npix = width*height;
+
+    uint32_t x, y, width = src->width, height = src->height, shift_x_u1;
+    uint32_t npix, stride;
+    double sum = 0, sqsum = 0;
+    int format = src->format;
+
+    npix = width * height;
     stride = ct_stride_bytes(src);
+    shift_x_u1 = src->roi.x % 8;    // Bit shift for U1 images with ROIs
 
 #define CASE_MEANSTDDEV(format, type, acctype) \
     case format: \
-    { \
-        acctype s = 0, s2 = 0; \
-        for( y = 0; y < src->height; y++ ) \
         { \
-            const type* ptr = (const type*)(src->data.y + stride*y); \
-            for( x = 0; x < src->width; x++ ) \
+            acctype s = 0, s2 = 0; \
+            for ( y = 0; y < height; y++ ) \
             { \
-                type val = ptr[x]; \
-                s += val; \
-                s2 += (acctype)val*val; \
+                const type* ptr = (const type*)(src->data.y + stride * y); \
+                for ( x = 0; x < width; x++ ) \
+                { \
+                    type val; \
+                    if (format == VX_DF_IMAGE_U1) \
+                    { \
+                        uint32_t x_shiftd = x + shift_x_u1; \
+                        val = (ptr[x_shiftd / 8] & (1 << (x_shiftd % 8))) >> (x_shiftd % 8); \
+                    } \
+                    else \
+                    { \
+                        val =  ptr[x]; \
+                    } \
+                    s += val; \
+                    s2 += (acctype)val * val; \
+                } \
             } \
+            sum = (double)s; \
+            sqsum = (double)s2; \
         } \
-        sum = (double)s; sqsum = (double)s2; \
-    } \
-    break
+        break
 
-    switch(format)
+    switch (format)
     {
+    CASE_MEANSTDDEV(VX_DF_IMAGE_U1, uint8_t, uint64_t);
     CASE_MEANSTDDEV(VX_DF_IMAGE_U8, uint8_t, uint64_t);
     default:
         FAIL("Unsupported image format: (%d)", &src->format);
     }
 
-    *_mean = (vx_float32)(sum/npix);
-    sqsum = sqsum/npix - (sum/npix)*(sum/npix);
+    *_mean = (vx_float32)(sum / npix);
+    sqsum = (sqsum / npix) - (sum / npix) * (sum / npix);
     *_stddev = (vx_float32)sqrt(CT_MAX(sqsum, 0.));
 }
 
-
 TESTCASE(MeanStdDev, CT_VXContext, ct_setup_vx_context, 0)
 
 typedef struct {
@@ -75,13 +89,14 @@
     vx_df_image format;
 } format_arg;
 
-
-#define MEANSTDDEV_TEST_CASE(imm, tp) \
-    {#imm "/" #tp, CT_##imm##_MODE, VX_DF_IMAGE_##tp}
+#define MEANSTDDEV_TEST_CASE_U8(imm)    {        #imm, CT_##imm##_MODE, VX_DF_IMAGE_U8}
+#define MEANSTDDEV_TEST_CASE_U1(imm)    {"_U1_/" #imm, CT_##imm##_MODE, VX_DF_IMAGE_U1}
 
 TEST_WITH_ARG(MeanStdDev, testOnRandom, format_arg,
-              MEANSTDDEV_TEST_CASE(Immediate, U8),
-              MEANSTDDEV_TEST_CASE(Graph, U8),
+              MEANSTDDEV_TEST_CASE_U8(Immediate),
+              MEANSTDDEV_TEST_CASE_U8(Graph),
+              MEANSTDDEV_TEST_CASE_U1(Immediate),
+              MEANSTDDEV_TEST_CASE_U1(Graph),
               )
 {
     double mean_tolerance = 1e-4;
@@ -97,7 +112,7 @@
     int iter, niters = 100;
     uint64_t rng;
     vx_float32 mean0 = 0.f, stddev0 = 0.f, mean = 0.f, stddev = 0.f;
-    int a = 0, b = 256;
+    int a = 0, b = (format == VX_DF_IMAGE_U1) ? 2 : 256;
 
     rng = CT()->seed_;
     mean_tolerance *= b;
@@ -110,9 +125,9 @@
 
     for( iter = 0; iter < niters; iter++ )
     {
+        double mean_diff, stddev_diff;
         int width = ct_roundf(ct_log_rng(&rng, 0, 10));
         int height = ct_roundf(ct_log_rng(&rng, 0, 10));
-        double mean_diff, stddev_diff;
         width = CT_MAX(width, 1);
         height = CT_MAX(height, 1);
 
@@ -122,6 +137,11 @@
             height = CT_MIN((height + 7) & -8, 480);
         }
 
+        if (format == VX_DF_IMAGE_U1)
+        {
+            width = ((width + 7) / 8) * 8;      // Width must be multiple of 8 for U1 images
+        }
+
         ct_update_progress(iter, niters);
 
         src0 = ct_allocate_ct_image_random(width, height, format, &rng, a, b);
@@ -175,4 +195,106 @@
     VX_CALL(vxReleaseScalar(&stddev_s));
 }
 
-TESTCASE_TESTS(MeanStdDev, testOnRandom)
+typedef struct {
+    const char* name;
+    int mode;
+    vx_df_image format;
+    vx_rectangle_t region_shift;
+} format_region_arg;
+
+
+#define MEANSTDDEV_REGION_TEST_CASE_U8(imm, shrink) \
+    {        #imm "/RegionShrink=" #shrink, CT_##imm##_MODE, VX_DF_IMAGE_U8, {shrink, shrink, -shrink, -shrink}}
+#define MEANSTDDEV_REGION_TEST_CASE_U1(imm, shrink) \
+    {"_U1_/" #imm "/RegionShrink=" #shrink, CT_##imm##_MODE, VX_DF_IMAGE_U1, {shrink, shrink, -shrink, -shrink}}
+
+TEST_WITH_ARG(MeanStdDev, testOnRandomWithValidRegion, format_region_arg,
+              MEANSTDDEV_REGION_TEST_CASE_U8(Immediate, 1),
+              MEANSTDDEV_REGION_TEST_CASE_U8(Immediate, 7),
+              MEANSTDDEV_REGION_TEST_CASE_U1(Immediate, 1),
+              MEANSTDDEV_REGION_TEST_CASE_U1(Immediate, 7),
+              )
+{
+    double mean_tolerance = 1e-4;
+    double stddev_tolerance = 1e-4;
+    int format = arg_->format;
+    vx_image src;
+    CT_Image src0;
+    vx_scalar mean_s, stddev_s;
+    vx_context context = context_->vx_context_;
+    int iter, niters = 100;
+    uint64_t rng;
+    vx_float32 mean0 = 0.f, stddev0 = 0.f, mean = 0.f, stddev = 0.f;
+    int a = 0, b = (format == VX_DF_IMAGE_U1) ? 2 : 256;
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->region_shift;
+
+    rng = CT()->seed_;
+    mean_tolerance *= b;
+    stddev_tolerance *= b;
+
+    mean_s = vxCreateScalar(context, VX_TYPE_FLOAT32, &mean);
+    ASSERT_VX_OBJECT(mean_s, VX_TYPE_SCALAR);
+    stddev_s = vxCreateScalar(context, VX_TYPE_FLOAT32, &stddev);
+    ASSERT_VX_OBJECT(stddev_s, VX_TYPE_SCALAR);
+
+    for( iter = 0; iter < niters; iter++ )
+    {
+        double mean_diff, stddev_diff;
+        int width  = ct_roundf(ct_log_rng(&rng, 0, 10));
+        int height = ct_roundf(ct_log_rng(&rng, 0, 10));
+        width  = CT_MAX(width, 15);             // Max region shrink is 7 on each side -> minimum size is 15
+        height = CT_MAX(height, 15);
+
+        if( !ct_check_any_size() )
+        {
+            width  = CT_MIN((width + 7) & -8, 640);
+            height = CT_MIN((height + 7) & -8, 480);
+        }
+
+        if (format == VX_DF_IMAGE_U1)
+        {
+            width = ((width + 7) / 8) * 8;      // Width must be multiple of 8 for U1 images
+        }
+
+        ct_update_progress(iter, niters);
+
+        ASSERT_NO_FAILURE(src0 = ct_allocate_ct_image_random(width, height, format, &rng, a, b));
+        ASSERT_VX_OBJECT(src = ct_image_to_vx_image(src0, context), VX_TYPE_IMAGE);
+
+        ASSERT_NO_FAILURE(ct_adjust_roi(src0, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+        reference_mean_stddev(src0, &mean0, &stddev0);
+
+        ASSERT_NO_FAILURE(vxGetValidRegionImage(src, &rect));
+        ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+        ASSERT_NO_FAILURE(vxSetImageValidRectangle(src, &rect));
+
+        ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxuMeanStdDev(context, src, &mean, &stddev));
+
+        mean_diff = fabs(mean - mean0);
+        stddev_diff = fabs(stddev - stddev0);
+
+        if( mean_diff > mean_tolerance ||
+            stddev_diff > stddev_tolerance )
+        {
+            CT_RecordFailureAtFormat("Test case %d. width=%d, height=%d,\n"
+                                     "\tExpected: mean=%.5g, stddev=%.5g\n"
+                                     "\tActual:   mean=%.5g (diff=%.5g %s %.5g), stddev=%.5f (diff=%.5g %s %.5g)\n",
+                                     __FUNCTION__, __FILE__, __LINE__,
+                                     iter, width, height,
+                                     mean0, stddev0,
+                                     mean, mean_diff, mean_diff > mean_tolerance ? ">" : "<=", mean_tolerance,
+                                     stddev, stddev_diff, stddev_diff > stddev_tolerance ? ">" : "<=", stddev_tolerance);
+            break;
+        }
+
+        VX_CALL(vxReleaseImage(&src));
+        CT_CollectGarbage(CT_GC_IMAGE);
+    }
+
+    VX_CALL(vxReleaseScalar(&mean_s));
+    VX_CALL(vxReleaseScalar(&stddev_s));
+}
+
+TESTCASE_TESTS(MeanStdDev, testOnRandom, testOnRandomWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_median3x3.c b/test_conformance/test_median3x3.c
index 4b577c9..f4ada07 100644
--- a/test_conformance/test_median3x3.c
+++ b/test_conformance/test_median3x3.c
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
-
 TESTCASE(Median3x3, CT_VXContext, ct_setup_vx_context, 0)
 
-
 TEST(Median3x3, testNodeCreation)
 {
     vx_context context = context_->vx_context_;
@@ -49,27 +49,47 @@
     ASSERT(src_image == 0);
 }
 
-
 // Generate input to cover these requirements:
 // There should be a image with randomly generated pixel intensities.
-static CT_Image median3x3_generate_random(const char* fileName, int width, int height)
+static CT_Image median3x3_generate_random(const char* fileName, int width, int height, vx_df_image format)
 {
     CT_Image image;
 
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 2));
+    else
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 256));
 
     return image;
 }
 
-static CT_Image median3x3_read_image(const char* fileName, int width, int height)
+static CT_Image median3x3_read_image(const char* fileName, int width, int height, vx_df_image format)
 {
-    CT_Image image = NULL;
+    CT_Image image_load = NULL, image_ret = NULL;
     ASSERT_(return 0, width == 0 && height == 0);
-    image = ct_read_image(fileName, 1);
-    ASSERT_(return 0, image);
-    ASSERT_(return 0, image->format == VX_DF_IMAGE_U8);
-    return image;
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    image_load = ct_read_image(fileName, 1);
+    ASSERT_(return 0, image_load);
+    ASSERT_(return 0, image_load->format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+    {
+        ASSERT_NO_FAILURE_(return 0, threshold_U8_ct_image(image_load, 127));   // Threshold to make the U1 image less trivial
+        ASSERT_NO_FAILURE_(return 0, image_ret = ct_allocate_image(image_load->width, image_load->height, VX_DF_IMAGE_U1));
+        ASSERT_NO_FAILURE_(return 0, U8_ct_image_to_U1_ct_image(image_load, image_ret));
+    }
+    else
+    {
+        image_ret = image_load;
+    }
+
+    ASSERT_(return 0, image_ret);
+    ASSERT_(return 0, image_ret->format == format);
+
+    return image_ret;
 }
 
 static int compare_for_median_get(const void * a, const void * b)
@@ -77,7 +97,18 @@
     return *(int*)a - *(int*)b;
 }
 
-static int32_t median_get(int32_t *values)
+static int32_t median_get_U1(int32_t values[9][2])
+{
+    int i;
+    int32_t v_acc = 0;
+    for (i = 0; i < 9; i++)     // Find median value by counting number of pixels == 1 and checking if sum > 4
+    {
+        v_acc += (values[i][0] & (1 << (values[i][1] % 8))) >> (values[i][1] % 8);
+    }
+    return (v_acc > 4) ? 1 : 0;
+}
+
+static int32_t median_get_U8(int32_t *values)
 {
     qsort(values, 9, sizeof(values[0]), compare_for_median_get);
     return values[4];
@@ -85,54 +116,109 @@
 
 static uint8_t median3x3_calculate(CT_Image src, uint32_t x, uint32_t y)
 {
-    int32_t values[9] = {
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 0),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y - 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 1),
-        (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 1)
-    };
-    return (uint8_t)median_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        int32_t values[9][2] = {
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y + 0), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y + 0), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y + 0), (int32_t)x + 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y - 1), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y - 1), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y - 1), (int32_t)x + 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 0, y + 1), (int32_t)x + 0},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x - 1, y + 1), (int32_t)x - 1},
+            {(int32_t)*CT_IMAGE_DATA_PTR_1U(src, x + 1, y + 1), (int32_t)x + 1}
+        };
+        return (uint8_t)median_get_U1(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 0),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y - 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 0, y + 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x - 1, y + 1),
+            (int32_t)*CT_IMAGE_DATA_PTR_8U(src, x + 1, y + 1)
+        };
+        return (uint8_t)median_get_U8(values);
+    }
 }
 
 static uint8_t median3x3_calculate_replicate(CT_Image src, uint32_t x_, uint32_t y_)
 {
     int32_t x = (int)x_;
     int32_t y = (int)y_;
-    int32_t values[9] = {
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 0),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y - 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 1),
-        (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 1)
-    };
-    return (uint8_t)median_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 0, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x - 1, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_1U(src, x + 1, y + 1)
+        };
+        return (uint8_t)median_get_U8(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 0),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y - 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 0, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x - 1, y + 1),
+            (int32_t)CT_IMAGE_DATA_REPLICATE_8U(src, x + 1, y + 1)
+        };
+        return (uint8_t)median_get_U8(values);
+    }
 }
 
 static uint8_t median3x3_calculate_constant(CT_Image src, uint32_t x_, uint32_t y_, vx_uint32 constant_value)
 {
     int32_t x = (int)x_;
     int32_t y = (int)y_;
-    int32_t values[9] = {
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 0, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y - 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 1, constant_value),
-        (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 1, constant_value)
-    };
-    return (uint8_t)median_get(values);
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        vx_bool const_val_bool = (constant_value == 0) ? vx_false_e : vx_true_e;
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y + 0, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y - 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 0, y + 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x - 1, y + 1, const_val_bool),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_1U(src, x + 1, y + 1, const_val_bool)
+        };
+        return (uint8_t)median_get_U8(values);
+    }
+    else
+    {
+        int32_t values[9] = {
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 0, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y - 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 0, y + 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x - 1, y + 1, constant_value),
+            (int32_t)CT_IMAGE_DATA_CONSTANT_8U(src, x + 1, y + 1, constant_value)
+        };
+        return (uint8_t)median_get_U8(values);
+    }
 }
 
 
@@ -140,35 +226,72 @@
 {
     CT_Image dst;
 
-    CT_ASSERT_(return NULL, src->format == VX_DF_IMAGE_U8);
+    CT_ASSERT_(return NULL, src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8);
 
     dst = ct_allocate_image(src->width, src->height, src->format);
 
     if (border.mode == VX_BORDER_UNDEFINED)
     {
-        CT_FILL_IMAGE_8U(return 0, dst,
-                if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
-                {
-                    uint8_t res = median3x3_calculate(src, x, y);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
+                    {
+                        uint32_t xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = median3x3_calculate(src, xShftdSrc, y);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    if (x >= 1 && y >= 1 && x < src->width - 1 && y < src->height - 1)
+                    {
+                        uint8_t res = median3x3_calculate(src, x, y);
+                        *dst_data = res;
+                    });
+        }
     }
     else if (border.mode == VX_BORDER_REPLICATE)
     {
-        CT_FILL_IMAGE_8U(return 0, dst,
-                {
-                    uint8_t res = median3x3_calculate_replicate(src, x, y);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    {
+                        uint32_t xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = median3x3_calculate_replicate(src, xShftdSrc, y);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    {
+                        uint8_t res = median3x3_calculate_replicate(src, x, y);
+                        *dst_data = res;
+                    });
+        }
     }
     else if (border.mode == VX_BORDER_CONSTANT)
     {
         vx_uint32 constant_value = border.constant_value.U32;
-        CT_FILL_IMAGE_8U(return 0, dst,
-                {
-                    uint8_t res = median3x3_calculate_constant(src, x, y, constant_value);
-                    *dst_data = res;
-                });
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return 0, dst,
+                    {
+                        uint32_t xShftdSrc = x + src->roi.x % 8;
+                        uint8_t res = median3x3_calculate_constant(src, xShftdSrc, y, constant_value);
+                        *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                    });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return 0, dst,
+                    {
+                        uint8_t res = median3x3_calculate_constant(src, x, y, constant_value);
+                        *dst_data = res;
+                    });
+        }
     }
     else
     {
@@ -210,15 +333,18 @@
 
 typedef struct {
     const char* testName;
-    CT_Image (*generator)(const char* fileName, int width, int height);
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     vx_border_t border;
     int width, height;
+    vx_df_image format;
 } Filter_Arg;
 
 #define MEDIAN_PARAMETERS \
-    CT_GENERATE_PARAMETERS("randomInput", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ARG, median3x3_generate_random, NULL), \
-    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ARG, median3x3_read_image, "lena.bmp")
+    CT_GENERATE_PARAMETERS("randomInput", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ARG, median3x3_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U8, ARG, median3x3_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/randomInput", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ARG, median3x3_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U1, ARG, median3x3_read_image, "lena.bmp")
 
 TEST_WITH_ARG(Median3x3, testGraphProcessing, Filter_Arg,
     MEDIAN_PARAMETERS
@@ -232,7 +358,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -274,7 +400,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -295,4 +421,60 @@
     ASSERT(src_image == 0);
 }
 
-TESTCASE_TESTS(Median3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+typedef struct {
+    const char* testName;
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    vx_border_t border;
+    int width, height;
+    vx_df_image format;
+    vx_rectangle_t regionShift;
+} ValidRegionTest_Arg;
+
+#ifdef MEDIAN_PARAMETERS
+#undef MEDIAN_PARAMETERS
+#endif
+#define MEDIAN_PARAMETERS \
+    CT_GENERATE_PARAMETERS("lena", ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VALID_REGION_SHRINKS, ARG, median3x3_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VALID_REGION_SHRINKS, ARG, median3x3_read_image, "lena.bmp")
+
+TEST_WITH_ARG(Median3x3, testWithValidRegion, ValidRegionTest_Arg,
+    MEDIAN_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, dst_image = 0;
+
+    CT_Image src = NULL, dst = NULL;
+    vx_border_t border = arg_->border;
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->regionShift;
+
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+
+    ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = ct_create_similar_image(src_image), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(src_image, &rect));
+    ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(src_image, &rect));
+
+    VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
+
+    VX_CALL(vxuMedian3x3(context, src_image, dst_image));
+
+    ASSERT_NO_FAILURE(dst = ct_image_from_vx_image(dst_image));
+    ASSERT_NO_FAILURE(ct_adjust_roi(dst, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+
+    ASSERT_NO_FAILURE(ct_adjust_roi(src, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+    ASSERT_NO_FAILURE(median3x3_check(src, dst, border));
+
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TESTCASE_TESTS(Median3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing, testWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_min.c b/test_conformance/test_min.c
index 024a5f9..082297e 100644
--- a/test_conformance/test_min.c
+++ b/test_conformance/test_min.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
 #include <string.h>
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -182,3 +184,5 @@
 
 }
 TESTCASE_TESTS(Min, testvxMin)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_minmaxloc.c b/test_conformance/test_minmaxloc.c
index 08be9d9..2f43f27 100644
--- a/test_conformance/test_minmaxloc.c
+++ b/test_conformance/test_minmaxloc.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -333,3 +335,6 @@
 }
 
 TESTCASE_TESTS(MinMaxLoc, testOnRandom)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
diff --git a/test_conformance/test_multiply.c b/test_conformance/test_multiply.c
index 16f74bc..c050a49 100644
--- a/test_conformance/test_multiply.c
+++ b/test_conformance/test_multiply.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -504,3 +506,5 @@
 
 TESTCASE_TESTS(vxuMultiply, DISABLED_testNegativeFormat, DISABLED_testNegativeSizes,                testFuzzy)
 TESTCASE_TESTS(vxMultiply,  DISABLED_testNegativeFormat, DISABLED_testNegativeSizes, testInference, testFuzzy)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_nnef_import.c b/test_conformance/test_nnef_import.c
new file mode 100644
index 0000000..eb27dd7
--- /dev/null
+++ b/test_conformance/test_nnef_import.c
@@ -0,0 +1,57 @@
+/*
+
+* Copyright (c) 2017-2017 The Khronos Group Inc.
+*
+* 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.
+*/
+
+#ifdef OPENVX_CONFORMANCE_NNEF_IMPORT
+
+#include <VX/vx_khr_import_kernel.h>
+
+#include "test_engine/test.h"
+
+typedef struct {
+    const char* name;
+    char  *type;
+    char  *url;
+} nnef_import_arg;
+
+#define NNEF_IMPORT_PARAMETERS \
+    ARG("importkernel", "vx_kernel", "./kernel.img") \
+
+
+TESTCASE(TensorNNEFImport, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST_WITH_ARG(TensorNNEFImport, testNNEFImport, nnef_import_arg,
+    NNEF_IMPORT_PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_char *type = arg_->type;
+    vx_char *url = arg_->url;
+    vx_kernel kernel = NULL;
+    vx_status status = VX_SUCCESS;
+
+    kernel = vxImportKernelFromURL(context, type, url);
+
+    status = vxGetStatus((vx_reference)kernel);
+
+    if(VX_SUCCESS == status)
+    {
+        VX_CALL(vxReleaseKernel(&kernel));
+        ASSERT(kernel == 0);
+    }
+}
+
+TESTCASE_TESTS(TensorNNEFImport, testNNEFImport)
+#endif
diff --git a/test_conformance/test_nonlinearfilter.c b/test_conformance/test_nonlinearfilter.c
index d5ad0cc..8243710 100644
--- a/test_conformance/test_nonlinearfilter.c
+++ b/test_conformance/test_nonlinearfilter.c
@@ -15,15 +15,14 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <VX/vx.h>
 #include <VX/vxu.h>
-
 #include "test_engine/test.h"
-#include "shared_functions.h"
 
 TESTCASE(NonLinearFilter, CT_VXContext, ct_setup_vx_context, 0)
 
-
 #define MASK_SIZE_MAX (5)
 
 #ifndef MIN
@@ -63,12 +62,16 @@
     ASSERT(src_image == 0);
 }
 
-static CT_Image generate_random(const char* fileName, int width, int height)
+static CT_Image generate_random(const char* fileName, int width, int height, vx_df_image format)
 {
     CT_Image image;
 
-    ASSERT_NO_FAILURE_(return 0,
-        image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 2));
+    else
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 256));
 
     return image;
 }
@@ -85,11 +88,13 @@
         return -1;
 }
 
-static void filter_calculate(vx_enum function, CT_Image src, vx_coordinates2d_t* origin, vx_int32 cols, vx_int32 rows, vx_uint8* mask, vx_border_t* border, int32_t x, int32_t y, uint8_t *data)
+static uint8_t filter_calculate(vx_enum function, CT_Image src, vx_coordinates2d_t* origin, vx_int32 cols, vx_int32 rows, vx_uint8* mask, vx_border_t* border, int32_t x, int32_t y, uint32_t shift_x_u1)
 {
     vx_uint8 values[MASK_SIZE_MAX * MASK_SIZE_MAX];
+    vx_uint8 res_val = 0;
 
     vx_int32 i, j, ci, cj, m = 0, v = 0;
+    vx_int32 x_start = (vx_int32)shift_x_u1;    // Bit-shift offset for U1 images, always 0 for other image formats
     vx_int32 cx = origin->x;
     vx_int32 cy = origin->y;
 
@@ -99,10 +104,17 @@
         {
             if (mask[m])
             {
-                ci = MAX(0, MIN(i, (vx_int32)src->width - 1));
+                ci = MAX(x_start, MIN(i, (vx_int32)src->width - 1 + x_start));
                 cj = MAX(0, MIN(j, (vx_int32)src->height - 1));
 
-                values[v++] = (border->mode == VX_BORDER_CONSTANT && (i != ci || j != cj)) ? border->constant_value.U8 : *CT_IMAGE_DATA_PTR_8U(src, ci, cj);
+                if (src->format == VX_DF_IMAGE_U1)
+                    values[v++] = (border->mode == VX_BORDER_CONSTANT && (i != ci || j != cj))
+                                    ?  border->constant_value.U1 ? 1 : 0
+                                    : (*CT_IMAGE_DATA_PTR_1U(src, ci, cj) & (1 << (ci % 8))) >> (ci % 8);
+                else
+                    values[v++] = (border->mode == VX_BORDER_CONSTANT && (i != ci || j != cj))
+                                    ? border->constant_value.U8
+                                    : *CT_IMAGE_DATA_PTR_8U(src, ci, cj);
             }
         }
     }
@@ -111,20 +123,23 @@
 
     switch (function)
     {
-    case VX_NONLINEAR_FILTER_MIN: *data = values[0]; break; /* minimal value */
-    case VX_NONLINEAR_FILTER_MAX: *data = values[v - 1]; break; /* maximum value */
-    case VX_NONLINEAR_FILTER_MEDIAN: *data = values[v / 2]; break; /* pick the middle value */
+    case VX_NONLINEAR_FILTER_MIN:    res_val = values[0];     break; /* minimal value */
+    case VX_NONLINEAR_FILTER_MAX:    res_val = values[v - 1]; break; /* maximum value */
+    case VX_NONLINEAR_FILTER_MEDIAN: res_val = values[v / 2]; break; /* pick the middle value */
     }
+
+    return res_val;
 }
 
 void filter_create_reference_image(vx_enum function, CT_Image src, vx_coordinates2d_t* origin, vx_size cols, vx_size rows, vx_uint8* mask, CT_Image* pdst, vx_border_t* border)
 {
     CT_Image dst = NULL;
 
-    CT_ASSERT(src->format == VX_DF_IMAGE_U8);
+    CT_ASSERT(src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8);
 
-    dst = ct_allocate_image(src->width, src->height, VX_DF_IMAGE_U8);
+    dst = ct_allocate_image(src->width, src->height, src->format);
 
+    vx_uint32 shift_x_u1 = (src->format == VX_DF_IMAGE_U1) ? src->roi.x % 8 : 0;
     if (border->mode == VX_BORDER_UNDEFINED)
     {
         vx_uint32 left = origin->x;
@@ -132,16 +147,41 @@
         vx_uint32 right = (vx_uint32)(cols - origin->x - 1);
         vx_uint32 bottom = (vx_uint32)(rows - origin->y - 1);
 
-        CT_FILL_IMAGE_8U(return, dst,
-            if (x >= left && y >= top && x < src->width - right && y < src->height - bottom)
-                filter_calculate(function, src, origin, (vx_int32)cols, (vx_int32)rows, mask, border, x, y, dst_data);
-        );
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return, dst,
+                if (x >= left && y >= top && x < src->width - right && y < src->height - bottom)
+                {
+                    uint32_t xShftdSrc = x + shift_x_u1;
+                    uint8_t res = filter_calculate(function, src, origin, (vx_int32)cols, (vx_int32)rows, mask, border, xShftdSrc, y, shift_x_u1);
+                    *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return, dst,
+                if (x >= left && y >= top && x < src->width - right && y < src->height - bottom)
+                    *dst_data = filter_calculate(function, src, origin, (vx_int32)cols, (vx_int32)rows, mask, border, x, y, 0);
+            );
+        }
     }
     else
     {
-        CT_FILL_IMAGE_8U(return, dst,
-            filter_calculate(function, src, origin, (vx_int32)cols, (vx_int32)rows, mask, border, x, y, dst_data);
-        );
+        if (src->format == VX_DF_IMAGE_U1)
+        {
+            CT_FILL_IMAGE_1U(return, dst,
+                {
+                    uint32_t xShftdSrc = x + shift_x_u1;
+                    uint8_t res = filter_calculate(function, src, origin, (vx_int32)cols, (vx_int32)rows, mask, border, xShftdSrc, y, shift_x_u1);
+                    *dst_data = (*dst_data & ~(1 << offset)) | (res << offset);
+                });
+        }
+        else
+        {
+            CT_FILL_IMAGE_8U(return, dst,
+                *dst_data = filter_calculate(function, src, origin, (vx_int32)cols, (vx_int32)rows, mask, border, x, y, 0);
+            );
+        }
     }
 
     *pdst = dst;
@@ -211,7 +251,7 @@
 
     EXPECT_EQ_CTIMAGE(dst_ref, dst);
 
-#if 0
+#if 1
     if (CT_HasFailure())
     {
         printf("=== SRC ===\n");
@@ -220,6 +260,9 @@
         ct_dump_image_info(dst);
         printf("=== EXPECTED ===\n");
         ct_dump_image_info(dst_ref);
+        ct_write_image("nlf_src.bmp",  src);
+        ct_write_image("nlf_calc.bmp", dst);
+        ct_write_image("nlf_ref.bmp",  dst_ref);
     }
 #endif
 }
@@ -227,13 +270,14 @@
 
 typedef struct {
     const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height);
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     vx_size mask_size;
     vx_enum function;
     vx_enum pattern;
     vx_border_t border;
     int width, height;
+    vx_df_image format;
 } Filter_Arg;
 
 
@@ -252,8 +296,10 @@
     CT_EXPAND(nextmacro(testArgName "/VX_PATTERN_CROSS", __VA_ARGS__, VX_PATTERN_CROSS))
 
 #define FILTER_PARAMETERS \
-    CT_GENERATE_PARAMETERS("randomInput/mask=3x3", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ARG, generate_random, NULL, 3), \
-    CT_GENERATE_PARAMETERS("randomInput/mask=5x5", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS_DISK, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ARG, generate_random, NULL, 5)
+    CT_GENERATE_PARAMETERS("randomInput/mask=3x3", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ARG, generate_random, NULL, 3), \
+    CT_GENERATE_PARAMETERS("randomInput/mask=5x5", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS_DISK, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ARG, generate_random, NULL, 5), \
+    CT_GENERATE_PARAMETERS("_U1_/randomInput/mask=3x3", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ARG, generate_random, NULL, 3), \
+    CT_GENERATE_PARAMETERS("_U1_/randomInput/mask=5x5", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS_DISK, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ARG, generate_random, NULL, 5)
 
 
 TEST_WITH_ARG(NonLinearFilter, testGraphProcessing, Filter_Arg,
@@ -270,7 +316,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -324,7 +370,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -353,7 +399,7 @@
     ASSERT(src_image == 0);
 }
 
-TEST_WITH_ARG(NonLinearFilter, testGraphProcessingWithNondefaultOrginMatrix, Filter_Arg,
+TEST_WITH_ARG(NonLinearFilter, testGraphProcessingWithNondefaultOriginMatrix, Filter_Arg,
     FILTER_PARAMETERS
     )
 {
@@ -367,7 +413,7 @@
     CT_Image src = NULL, dst = NULL;
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
 
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
@@ -409,4 +455,75 @@
     ASSERT(dst_image == 0);
     ASSERT(src_image == 0);
 }
-TESTCASE_TESTS(NonLinearFilter, testNodeCreation, testGraphProcessing, testImmediateProcessing, testGraphProcessingWithNondefaultOrginMatrix)
+
+typedef struct {
+    const char* testName;
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    vx_size mask_size;
+    vx_enum function;
+    vx_enum pattern;
+    vx_border_t border;
+    int width, height;
+    vx_df_image format;
+    vx_rectangle_t regionShift;
+} ValidRegionTest_Arg;
+
+#ifdef FILTER_PARAMETERS
+#undef FILTER_PARAMETERS
+#endif
+#define FILTER_PARAMETERS \
+    CT_GENERATE_PARAMETERS("randomInput/mask=3x3", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_256x256, ADD_TYPE_U8, ADD_VALID_REGION_SHRINKS, ARG, generate_random, NULL, 3), \
+    CT_GENERATE_PARAMETERS("randomInput/mask=5x5", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_256x256, ADD_TYPE_U8, ADD_VALID_REGION_SHRINKS, ARG, generate_random, NULL, 5), \
+    CT_GENERATE_PARAMETERS("_U1_/randomInput/mask=3x3", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_256x256, ADD_TYPE_U1, ADD_VALID_REGION_SHRINKS, ARG, generate_random, NULL, 3), \
+    CT_GENERATE_PARAMETERS("_U1_/randomInput/mask=5x5", ADD_FUNCTIONS, ADD_PATTERNS_BOX_CROSS, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_SIZE_256x256, ADD_TYPE_U1, ADD_VALID_REGION_SHRINKS, ARG, generate_random, NULL, 5)
+
+TEST_WITH_ARG(NonLinearFilter, testWithValidRegion, ValidRegionTest_Arg,
+    FILTER_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, dst_image = 0;
+    vx_matrix mask = 0;
+    vx_enum pattern = 0;
+
+    CT_Image src = NULL, dst = NULL;
+    vx_border_t border = arg_->border;
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->regionShift;
+
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+
+    ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = ct_create_similar_image(src_image), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(src_image, &rect));
+    ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(src_image, &rect));
+
+    ASSERT_VX_OBJECT(mask = vxCreateMatrixFromPattern(context, arg_->pattern, arg_->mask_size, arg_->mask_size),
+                     VX_TYPE_MATRIX);
+    VX_CALL(vxQueryMatrix(mask, VX_MATRIX_PATTERN, &pattern, sizeof(pattern)));
+    ASSERT_EQ_INT(arg_->pattern, pattern);
+
+    VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
+
+    VX_CALL(vxuNonLinearFilter(context, arg_->function, src_image, mask, dst_image));
+
+    ASSERT_NO_FAILURE(dst = ct_image_from_vx_image(dst_image));
+    ASSERT_NO_FAILURE(ct_adjust_roi(dst, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+
+    ASSERT_NO_FAILURE(ct_adjust_roi(src, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+    ASSERT_NO_FAILURE(filter_check(arg_->function, src, mask, dst, &border));
+
+    VX_CALL(vxReleaseMatrix(&mask));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(mask == 0);
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TESTCASE_TESTS(NonLinearFilter, testNodeCreation, testGraphProcessing, testImmediateProcessing, testGraphProcessingWithNondefaultOriginMatrix, testWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_nonmaxsuppression.c b/test_conformance/test_nonmaxsuppression.c
index 6d4d26f..91fed90 100644
--- a/test_conformance/test_nonmaxsuppression.c
+++ b/test_conformance/test_nonmaxsuppression.c
@@ -15,6 +15,7 @@
  * limitations under the License.
 */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
 
 #include "test_engine/test.h"
 
@@ -31,7 +32,7 @@
     vx_image mask = 0;
     vx_image output = 0;
     vx_uint32 src_width, src_height;
-    
+
     vx_int32 wsize = 3;
 
     vx_graph graph = 0;
@@ -72,6 +73,7 @@
 
     return image;
 }
+
 static CT_Image nonmaxsuppression_read_image(const char* fileName, int width, int height)
 {
     CT_Image image = NULL;
@@ -81,48 +83,65 @@
     ASSERT_(return 0, image->format == VX_DF_IMAGE_U8);
     return image;
 }
+
 static CT_Image nonmax_golden(vx_image input, vx_image mask, vx_int32 wsize)
 {
     vx_status status = VX_FAILURE;
-    vx_int32 height, width;
+    vx_int32 rect_start_x, rect_start_y, rect_width, rect_height;
+    vx_uint32 full_width, full_height;
     vx_uint8 mask_data = 0;
+    vx_df_image format = 0, mask_format = 0;
 
-    void *src_base = NULL;
-    void *mask_base = NULL;
-    void *dst_base = NULL;
+    status  = vxQueryImage(input, VX_IMAGE_WIDTH,  &full_width,  sizeof(full_width));
+    status |= vxQueryImage(input, VX_IMAGE_HEIGHT, &full_height, sizeof(full_height));
+    status |= vxQueryImage(input, VX_IMAGE_FORMAT, &format, sizeof(format));
 
     vx_imagepatch_addressing_t src_addr = VX_IMAGEPATCH_ADDR_INIT;
     vx_imagepatch_addressing_t mask_addr = VX_IMAGEPATCH_ADDR_INIT;
-    vx_rectangle_t src_rect, mask_rect;
+    vx_rectangle_t src_rect, mask_rect, full_rect = {0, 0, full_width, full_height};
     vx_map_id src_map_id = 0;
     vx_map_id mask_map_id = 0;
 
-    status = vxGetValidRegionImage(input, &src_rect);
-    status |= vxMapImagePatch(input, &src_rect, 0, &src_map_id, &src_addr, &src_base, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0);
+    void *src_base  = NULL;
+    void *mask_base = NULL;
+    void *dst_base  = NULL;
+
+    status |= vxGetValidRegionImage(input, &src_rect);
+    status |= vxMapImagePatch(input, &full_rect, 0, &src_map_id, &src_addr, &src_base, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0);
 
     if (mask != NULL)
     {
         status |= vxGetValidRegionImage(mask, &mask_rect);
-        status |= vxMapImagePatch(mask, &mask_rect, 0, &mask_map_id, &mask_addr, (void **)&mask_base, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);
+        status |= vxMapImagePatch(mask, &full_rect, 0, &mask_map_id, &mask_addr, (void **)&mask_base, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);
+        status |= vxQueryImage(mask, VX_IMAGE_FORMAT, &mask_format, sizeof(mask_format));
+        if ((mask_rect.start_x > src_rect.start_x) || (mask_rect.start_y > src_rect.start_y) ||
+            (mask_rect.end_x   < src_rect.end_x)   || (mask_rect.end_y   < src_rect.end_y))
+        {
+            status |= vxUnmapImagePatch(mask,  mask_map_id);
+            status |= vxUnmapImagePatch(input, src_map_id);
+            FAIL_(return NULL, "The mask's valid region didn't cover the entire valid region of the input image.");
+        }
     }
-    vx_df_image format = 0;
-    status |= vxQueryImage(input, VX_IMAGE_FORMAT, &format, sizeof(format));
 
-    width = src_addr.dim_x;
-    height = src_addr.dim_y;
+    rect_start_x = src_rect.start_x;
+    rect_start_y = src_rect.start_y;
+    rect_width   = src_rect.end_x - src_rect.start_x;
+    rect_height  = src_rect.end_y - src_rect.start_y;
 
-    CT_Image output = ct_allocate_image(width, height, format);
+    CT_Image output = ct_allocate_image(full_width, full_height, format);
     dst_base = ct_image_get_plane_base(output, 0);
     vx_int32 border = wsize / 2;
 
-    for (vx_int32 x = border; x < (width - border); x++)
+    for (vx_int32 x = rect_start_x + border; x < (rect_start_x + rect_width - border); x++)
     {
-        for (vx_int32 y = border; y < (height - border); y++)
+        for (vx_int32 y = rect_start_y + border; y < (rect_start_y + rect_height - border); y++)
         {
             vx_uint8 *_mask;
             if (mask != NULL)
             {
                 _mask = (vx_uint8 *)vxFormatImagePatchAddress2d(mask_base, x, y, &mask_addr);
+                if (mask_format == VX_DF_IMAGE_U1)
+                    _mask = (*_mask & (1 << (x % 8))) != 0 ? _mask : &mask_data;
             }
             else
             {
@@ -143,18 +162,20 @@
                     for (vx_int32 j = -border; j <= border; j++)
                     {
                         void *neighbor = vxFormatImagePatchAddress2d(src_base, x + i, y + j, &src_addr);
-			if (mask != NULL)
-			{
-				_mask = (vx_uint8 *)vxFormatImagePatchAddress2d(mask_base, x + i, y + j, &mask_addr);
-			}
-			else
-			{
-				_mask = &mask_data;
-			}
+                        if (mask != NULL)
+                        {
+                            _mask = (vx_uint8 *)vxFormatImagePatchAddress2d(mask_base, x + i, y + j, &mask_addr);
+                            if (mask_format == VX_DF_IMAGE_U1)
+                                _mask = (*_mask & (1 << ((x + i) % 8))) != 0 ? _mask : &mask_data;
+                        }
+                        else
+                        {
+                            _mask = &mask_data;
+                        }
                         vx_int32 neighbor_val = *(vx_int16 *)neighbor;
                         if ((*_mask == 0)
-			   && (((j < 0 || (j == 0 && i <= 0)) && (src_val < neighbor_val))
-			      || ((j > 0 || (j == 0 && i > 0)) && (src_val <= neighbor_val))))
+                            && ( ((j < 0 || (j == 0 && i <= 0)) && (src_val < neighbor_val))
+                                 || ((j > 0 || (j == 0 && i > 0)) && (src_val <= neighbor_val)) ))
                         {
                             flag = 0;
                             break;
@@ -165,6 +186,7 @@
                         break;
                     }
                 }
+
                 if (flag)
                 {
                     *(vx_int16 *)dest = (vx_int16)src_val;
@@ -184,29 +206,37 @@
 
     return output;
 }
+
 typedef struct {
     const char* testName;
     CT_Image(*generator)(const char* fileName, int width, int height);
     const char* fileName;
     vx_int32 wsize;
     vx_bool _mask;
+    vx_df_image maskFormat;
     vx_df_image format;
     const char* result_filename;
 } Arg;
 
 #define PARAMETERS \
-    ARG("case_1_nomask_u8_nms", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 1, vx_false_e, VX_DF_IMAGE_U8, "nms_1_nomask.bmp"), \
-    ARG("case_3_nomask_u8_nms", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_false_e, VX_DF_IMAGE_U8, "nms_3_nomask.bmp"), \
-    ARG("case_5_nomask_u8_nms", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 5, vx_false_e, VX_DF_IMAGE_U8, "nms_5_nomask.bmp"), \
-    ARG("case_1_mask_u8_nms", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 1, vx_true_e, VX_DF_IMAGE_U8, "nms_1_mask.bmp"), \
-    ARG("case_3_mask_u8_nms", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_true_e, VX_DF_IMAGE_U8, "nms_3_mask.bmp"), \
-    ARG("case_5_mask_u8_nms", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 5, vx_true_e, VX_DF_IMAGE_U8, "nms_5_mask.bmp"), \
-    ARG("case_1_nomask_s16_nms", nonmaxsuppression_generate_random, NULL, 1, vx_false_e, VX_DF_IMAGE_S16, NULL), \
-    ARG("case_3_nomask_s16_nms", nonmaxsuppression_generate_random, NULL, 3, vx_false_e, VX_DF_IMAGE_S16, NULL), \
-    ARG("case_5_nomask_s16_nms", nonmaxsuppression_generate_random, NULL, 5, vx_false_e, VX_DF_IMAGE_S16, NULL), \
-    ARG("case_1_mask_s16_nms", nonmaxsuppression_generate_random, NULL, 1, vx_true_e, VX_DF_IMAGE_S16, NULL), \
-    ARG("case_3_mask_s16_nms", nonmaxsuppression_generate_random, NULL, 3, vx_true_e, VX_DF_IMAGE_S16, NULL), \
-    ARG("case_5_mask_s16_nms", nonmaxsuppression_generate_random, NULL, 5, vx_true_e, VX_DF_IMAGE_S16, NULL), \
+    ARG("case_1_U8_nomask", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 1, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_1_nomask.bmp"), \
+    ARG("case_3_U8_nomask", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_3_nomask.bmp"), \
+    ARG("case_5_U8_nomask", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 5, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_5_nomask.bmp"), \
+    ARG("case_1_U8_mask",   nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 1, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_1_mask.bmp"), \
+    ARG("case_3_U8_mask",   nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_3_mask.bmp"), \
+    ARG("case_5_U8_mask",   nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 5, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_5_mask.bmp"), \
+    ARG("case_1_S16_nomask", nonmaxsuppression_generate_random, NULL, 1, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL), \
+    ARG("case_3_S16_nomask", nonmaxsuppression_generate_random, NULL, 3, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL), \
+    ARG("case_5_S16_nomask", nonmaxsuppression_generate_random, NULL, 5, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL), \
+    ARG("case_1_S16_mask",   nonmaxsuppression_generate_random, NULL, 1, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL), \
+    ARG("case_3_S16_mask",   nonmaxsuppression_generate_random, NULL, 3, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL), \
+    ARG("case_5_S16_mask",   nonmaxsuppression_generate_random, NULL, 5, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL), \
+    ARG("_U1_/case_1_U8_mask",  nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 1, vx_true_e, VX_DF_IMAGE_U1, VX_DF_IMAGE_U8, "nms_1_mask.bmp"), \
+    ARG("_U1_/case_3_U8_mask",  nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_true_e, VX_DF_IMAGE_U1, VX_DF_IMAGE_U8, "nms_3_mask.bmp"), \
+    ARG("_U1_/case_5_U8_mask",  nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 5, vx_true_e, VX_DF_IMAGE_U1, VX_DF_IMAGE_U8, "nms_5_mask.bmp"), \
+    ARG("_U1_/case_1_S16_mask", nonmaxsuppression_generate_random, NULL, 1, vx_true_e, VX_DF_IMAGE_U1, VX_DF_IMAGE_S16, NULL), \
+    ARG("_U1_/case_3_S16_mask", nonmaxsuppression_generate_random, NULL, 3, vx_true_e, VX_DF_IMAGE_U1, VX_DF_IMAGE_S16, NULL), \
+    ARG("_U1_/case_5_s16_mask", nonmaxsuppression_generate_random, NULL, 5, vx_true_e, VX_DF_IMAGE_U1, VX_DF_IMAGE_S16, NULL)
 
 TEST_WITH_ARG(Nonmaxsuppression, testGraphProcessing, Arg,
     PARAMETERS
@@ -248,23 +278,25 @@
 
     if (arg_->_mask)
     {
-        ASSERT_VX_OBJECT(mask = vxCreateImage(context, src_width, src_height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(mask = vxCreateImage(context, src_width, src_height, arg_->maskFormat), VX_TYPE_IMAGE);
         status = vxGetValidRegionImage(mask, &mask_rect);
         status |= vxMapImagePatch(mask, &mask_rect, 0, &mask_map_id, &mask_addr, (void **)&mask_base, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);
         for (vx_uint32 i = 0; i < src_width; i++)
         {
             for (vx_uint32 j = 0; j < src_height; j++)
             {
-                void *src = vxFormatImagePatchAddress2d(mask_base, i, j, &mask_addr);
+                vx_uint8 val;
+                void *mask_ptr = vxFormatImagePatchAddress2d(mask_base, i, j, &mask_addr);
                 if (i % 2 == 0 && j % 2 == 0)
                 {
-                    *(vx_uint8 *)src = 1;
+                    val = 1;
                 }
                 else
                 {
-                    *(vx_uint8 *)src = 0;
+                    val = 0;
                 }
-               
+                *(vx_uint8 *)mask_ptr = (arg_->maskFormat == VX_DF_IMAGE_U1)
+                                        ? (*(vx_uint8 *)mask_ptr & ~(1 << (i % 8))) | (val << (i % 8)) : val;
             }
         }
         status |= vxUnmapImagePatch(mask, mask_map_id);
@@ -310,7 +342,6 @@
 )
 {
     vx_context context = context_->vx_context_;
-    vx_graph graph = 0;
 
     vx_image input = 0;
     vx_image mask = 0;
@@ -344,22 +375,25 @@
 
     if (arg_->_mask)
     {
-        ASSERT_VX_OBJECT(mask = vxCreateImage(context, src_width, src_height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(mask = vxCreateImage(context, src_width, src_height, arg_->maskFormat), VX_TYPE_IMAGE);
         status = vxGetValidRegionImage(mask, &mask_rect);
         status |= vxMapImagePatch(mask, &mask_rect, 0, &mask_map_id, &mask_addr, (void **)&mask_base, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);
         for (vx_uint32 i = 0; i < src_width; i++)
         {
             for (vx_uint32 j = 0; j < src_height; j++)
             {
-                void *src = vxFormatImagePatchAddress2d(mask_base, i, j, &mask_addr);
+                vx_uint8 val;
+                void *mask_ptr = vxFormatImagePatchAddress2d(mask_base, i, j, &mask_addr);
                 if (i % 2 == 0 && j % 2 == 0)
                 {
-                    *(vx_uint8 *)src = 1;
+                    val = 1;
                 }
                 else
                 {
-                    *(vx_uint8 *)src = 0;
+                    val = 0;
                 }
+                *(vx_uint8 *)mask_ptr = (arg_->maskFormat == VX_DF_IMAGE_U1)
+                                        ? (*(vx_uint8 *)mask_ptr & ~(1 << (i % 8))) | (val << (i % 8)) : val;
             }
         }
         status |= vxUnmapImagePatch(mask, mask_map_id);
@@ -392,10 +426,133 @@
     ASSERT(output == 0);
     ASSERT(mask == 0);
     ASSERT(input == 0);
-    ASSERT(graph == 0);
+}
+
+typedef struct {
+    const char* testName;
+    CT_Image(*generator)(const char* fileName, int width, int height);
+    const char* fileName;
+    vx_int32 wsize;
+    vx_bool _mask;
+    vx_df_image maskFormat;
+    vx_df_image format;
+    const char* result_filename;
+    vx_rectangle_t region_shift;
+} ValidRegionTest_Arg;
+
+#define REGION_PARAMETERS \
+    ARG("case_1_U8_nomask_region_shrink=1", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 1, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_1_nomask.bmp", {1, 1, -1, -1}), \
+    ARG("case_1_U8_nomask_region_shrink=7", nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 1, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_1_nomask.bmp", {7, 7, -7, -7}), \
+    ARG("case_3_U8_mask_region_shrink=1",   nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_3_mask.bmp",   {1, 1, -1, -1}), \
+    ARG("case_3_U8_mask_region_shrink=7",   nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_U8, "nms_3_mask.bmp",   {7, 7, -7, -7}), \
+    ARG("case_1_S16_nomask_region_shrink=1", nonmaxsuppression_generate_random, NULL, 1, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL, {1, 1, -1, -1}), \
+    ARG("case_1_S16_nomask_region_shrink=7", nonmaxsuppression_generate_random, NULL, 1, vx_false_e, VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL, {7, 7, -7, -7}), \
+    ARG("case_3_S16_mask_region_shrink=1",   nonmaxsuppression_generate_random, NULL, 3, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL, {1, 1, -1, -1}), \
+    ARG("case_3_S16_mask_region_shrink=7",   nonmaxsuppression_generate_random, NULL, 3, vx_true_e,  VX_DF_IMAGE_U8, VX_DF_IMAGE_S16, NULL, {7, 7, -7, -7}), \
+    ARG("_U1_/case_3_U8_mask_region_shrink=1",  nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_true_e,  VX_DF_IMAGE_U1, VX_DF_IMAGE_U8, "nms_3_mask.bmp",   {1, 1, -1, -1}), \
+    ARG("_U1_/case_3_U8_mask_region_shrink=7",  nonmaxsuppression_read_image, "blurred_lena_gray.bmp", 3, vx_true_e,  VX_DF_IMAGE_U1, VX_DF_IMAGE_U8, "nms_3_mask.bmp",   {7, 7, -7, -7}), \
+    ARG("_U1_/case_3_S16_mask_region_shrink=1", nonmaxsuppression_generate_random, NULL, 3, vx_true_e,  VX_DF_IMAGE_U1, VX_DF_IMAGE_S16, NULL, {1, 1, -1, -1}), \
+    ARG("_U1_/case_3_S16_mask_region_shrink=7", nonmaxsuppression_generate_random, NULL, 3, vx_true_e,  VX_DF_IMAGE_U1, VX_DF_IMAGE_S16, NULL, {7, 7, -7, -7})
+
+TEST_WITH_ARG(Nonmaxsuppression, testWithValidRegion, ValidRegionTest_Arg,
+    REGION_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+
+    vx_image input = 0, mask = 0, output = 0;
+    vx_uint32 src_width, src_height;
+
+    vx_int32 wsize = arg_->wsize;
+    vx_int32 border = wsize / 2;
+    CT_Image ct_input = NULL, ct_output = NULL, golden_image = NULL;
+
+    vx_status status;
+
+    void *mask_base = NULL;
+    vx_imagepatch_addressing_t mask_addr = VX_IMAGEPATCH_ADDR_INIT;
+    vx_rectangle_t mask_rect, src_rect, rect_shft = arg_->region_shift;
+    vx_map_id mask_map_id = 0;
+
+    if (arg_->format == VX_DF_IMAGE_U8)
+    {
+        ASSERT_NO_FAILURE(ct_input = arg_->generator(arg_->fileName, 0, 0));
+    }
+    else    // format == VX_DF_IMAGE_S16
+    {
+        ASSERT_NO_FAILURE(ct_input = arg_->generator(arg_->fileName, 640, 480));
+    }
+    src_width  = ct_input->width;
+    src_height = ct_input->height;
+
+    ASSERT_VX_OBJECT(input = ct_image_to_vx_image(ct_input, context), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(output = vxCreateImage(context, src_width, src_height, arg_->format), VX_TYPE_IMAGE);
+
+    if (arg_->_mask)
+    {
+        ASSERT_VX_OBJECT(mask = vxCreateImage(context, src_width, src_height, arg_->maskFormat), VX_TYPE_IMAGE);
+        status = vxGetValidRegionImage(mask, &mask_rect);
+        status |= vxMapImagePatch(mask, &mask_rect, 0, &mask_map_id, &mask_addr, (void **)&mask_base, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0);
+        for (vx_uint32 i = 0; i < src_width; i++)
+        {
+            for (vx_uint32 j = 0; j < src_height; j++)
+            {
+                vx_uint8 val;
+                void *mask_ptr = vxFormatImagePatchAddress2d(mask_base, i, j, &mask_addr);
+                if (i % 2 == 0 && j % 2 == 0)
+                {
+                    val = 1;
+                }
+                else
+                {
+                    val = 0;
+                }
+                *(vx_uint8 *)mask_ptr = (arg_->maskFormat == VX_DF_IMAGE_U1)
+                                        ? (*(vx_uint8 *)mask_ptr & ~(1 << (i % 8))) | (val << (i % 8)) : val;
+            }
+        }
+        status |= vxUnmapImagePatch(mask, mask_map_id);
+    }
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(input, &src_rect));
+    ALTERRECTANGLE(src_rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(input, &src_rect));
+
+    VX_CALL(vxuNonMaxSuppression(context, input, mask, wsize, output));
+
+    ASSERT_NO_FAILURE(ct_output = ct_image_from_vx_image(output));
+
+    if (arg_->format == VX_DF_IMAGE_U8)
+    {
+        golden_image = arg_->generator(arg_->result_filename, 0, 0);
+    }
+    else
+    {
+        golden_image = nonmax_golden(input, mask, wsize);
+    }
+
+    ct_adjust_roi(ct_output,    rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y);
+    ct_adjust_roi(golden_image, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y);
+    ct_adjust_roi(ct_output,    border, border, border, border);
+    ct_adjust_roi(golden_image, border, border, border, border);
+    EXPECT_EQ_CTIMAGE(golden_image, ct_output);
+
+    VX_CALL(vxReleaseImage(&input));
+    if (arg_->_mask)
+    {
+        VX_CALL(vxReleaseImage(&mask));
+    }
+    VX_CALL(vxReleaseImage(&output));
+
+    ASSERT(output == 0);
+    ASSERT(mask == 0);
+    ASSERT(input == 0);
 }
 
 TESTCASE_TESTS(Nonmaxsuppression,
                testNodeCreation,
                testGraphProcessing,
-               testImmediateProcessing)
+               testImmediateProcessing,
+               testWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_not.c b/test_conformance/test_not.c
index 5ef9366..d89ad56 100644
--- a/test_conformance/test_not.c
+++ b/test_conformance/test_not.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -29,65 +31,124 @@
     ASSERT(src && dst);
     ASSERT(src->width == dst->width);
     ASSERT(src->height == dst->height);
-    ASSERT(src->format == dst->format && src->format == VX_DF_IMAGE_U8);
+    ASSERT(src->format == dst->format && (src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8));
 
     for (i = 0; i < dst->height; ++i)
         for (j = 0; j < dst->width; ++j)
-            dst->data.y[i * dst->stride + j] = ~src->data.y[i * src->stride + j];
+            if (src->format == VX_DF_IMAGE_U1)
+            {
+                uint32_t xShftd = j + src->roi.x % 8;         // Offset needed for U1 ROI
+                uint8_t  pixel  = ~src->data.y[i * ct_stride_bytes(src) + xShftd / 8] & (1 << xShftd % 8);
+                dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                    (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~(1 << xShftd % 8)) | pixel;
+            }
+            else
+            {
+                dst->data.y[i * dst->stride + j] = ~src->data.y[i * src->stride + j];
+            }
 }
 
-static void fillSquence(CT_Image dst, uint32_t seq_init)
+static void fillSequence(CT_Image dst, uint32_t seq_init)
 {
     uint32_t i, j;
     uint32_t val = seq_init;
 
     ASSERT(dst);
-    ASSERT(dst->format == VX_DF_IMAGE_U8);
+    ASSERT(dst->format == VX_DF_IMAGE_U1 || dst->format == VX_DF_IMAGE_U8);
 
     for (i = 0; i < dst->height; ++i)
+    {
         for (j = 0; j < dst->width; ++j)
-            dst->data.y[i * dst->stride + j] = ++val;
+        {
+            if (dst->format == VX_DF_IMAGE_U1)
+            {
+                uint32_t xShftd = j + dst->roi.x % 8;         // Offset needed for U1 ROI
+                uint8_t  pixel  = (++val % 2) << (xShftd % 8);
+                dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] =
+                    (dst->data.y[i * ct_stride_bytes(dst) + xShftd / 8] & ~(1 << (xShftd % 8))) | pixel;
+            }
+            else
+            {
+                dst->data.y[i * dst->stride + j] = ++val;
+            }
+        }
+    }
 }
 
 TESTCASE(vxuNot, CT_VXContext, ct_setup_vx_context, 0)
 TESTCASE(vxNot,  CT_VXContext, ct_setup_vx_context, 0)
 
-
 TEST(vxuNot, testNegativeSizes)
 {
-    vx_image src16x88, dst88x16;
+    vx_image src16x88u8, dst88x16u8;
     vx_context context = context_->vx_context_;
 
-    ASSERT_VX_OBJECT(src16x88 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-    ASSERT_VX_OBJECT(dst88x16 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src16x88u8 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst88x16u8 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+
+    // initialize to guarantee that the image is allocated
+    ASSERT_NO_FAILURE(ct_fill_image_random(src16x88u8, &CT()->seed_));
+
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuNot(context, src16x88u8, dst88x16u8));
+
+    VX_CALL(vxReleaseImage(&src16x88u8));
+    VX_CALL(vxReleaseImage(&dst88x16u8));
+}
+
+TEST(vxuNot, testNegativeSizes_U1_)
+{
+    vx_image src16x88u1, dst88x16u1;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(src16x88u1 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst88x16u1 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
 
     // initialize to guarantee that images are allocated
-    ASSERT_NO_FAILURE(ct_fill_image_random(src16x88, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src16x88u1, &CT()->seed_));
 
-    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuNot(context, src16x88, dst88x16));
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxuNot(context, src16x88u1, dst88x16u1));
 
-    VX_CALL(vxReleaseImage(&src16x88));
-    VX_CALL(vxReleaseImage(&dst88x16));
+    VX_CALL(vxReleaseImage(&src16x88u1));
+    VX_CALL(vxReleaseImage(&dst88x16u1));
 }
 
 TEST(vxNot, testNegativeSizes)
 {
-    vx_image src16x88, dst88x16;
+    vx_image src16x88u8, dst88x16u8;
     vx_graph graph;
     vx_context context = context_->vx_context_;
 
-    ASSERT_VX_OBJECT(src16x88 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-    ASSERT_VX_OBJECT(dst88x16 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src16x88u8 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst88x16u8 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
 
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-    ASSERT_VX_OBJECT(vxNotNode(graph, src16x88, dst88x16), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(vxNotNode(graph, src16x88u8, dst88x16u8), VX_TYPE_NODE);
     EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
 
-    VX_CALL(vxReleaseImage(&src16x88));
-    VX_CALL(vxReleaseImage(&dst88x16));
+    VX_CALL(vxReleaseImage(&src16x88u8));
+    VX_CALL(vxReleaseImage(&dst88x16u8));
     VX_CALL(vxReleaseGraph(&graph));
 }
 
+TEST(vxNot, testNegativeSizes_U1_)
+{
+    vx_image src16x88u1, dst88x16u1;
+    vx_graph graph;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(src16x88u1 = vxCreateImage(context, 16, 88, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst88x16u1 = vxCreateImage(context, 88, 16, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(vxNotNode(graph, src16x88u1, dst88x16u1), VX_TYPE_NODE);
+    EXPECT_NE_VX_STATUS(VX_SUCCESS, vxVerifyGraph(graph));
+
+    VX_CALL(vxReleaseImage(&src16x88u1));
+    VX_CALL(vxReleaseImage(&dst88x16u1));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+static vx_df_image target_format;
 static vx_image inference_image;
 static vx_action VX_CALLBACK inference_image_test(vx_node node)
 {
@@ -101,7 +162,7 @@
 
     EXPECT_EQ_INT(640, width);
     EXPECT_EQ_INT(480, height);
-    EXPECT_EQ_INT(VX_DF_IMAGE_U8, format);
+    EXPECT_EQ_INT(target_format, format);
 
     return VX_ACTION_CONTINUE;
 }
@@ -123,6 +184,7 @@
     ASSERT_VX_OBJECT(tmp   = vxAddNode(graph, dst, src, VX_CONVERT_POLICY_WRAP, gr), VX_TYPE_NODE);
 
     // test
+    target_format = VX_DF_IMAGE_U8;
     inference_image = dst;
     EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxAssignNodeCallback(n, inference_image_test));
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxProcessGraph(graph));
@@ -135,48 +197,99 @@
     VX_CALL(vxReleaseGraph(&graph));
 }
 
+TEST(vxNot, testInference_U1_)
+{
+    vx_image src, dst, src2, dst2, gr;
+    vx_scalar sshift;
+    vx_int32 sval = 0;
+    vx_graph graph;
+    vx_node n, cn1, cn2, tmp;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(src   = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U1), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst   = vxCreateVirtualImage(graph, 0, 0, VX_DF_IMAGE_VIRT), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(n     = vxNotNode(graph, src, dst), VX_TYPE_NODE);
+
+    // grounding (convert U1 images to U8 since vxAddNode doesn't support U1 images)
+    ASSERT_VX_OBJECT(src2  = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst2  = vxCreateImage(context, 640, 480, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(gr    = vxCreateImage(context, 640, 480, VX_DF_IMAGE_S16), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(sshift = vxCreateScalar(context, VX_TYPE_INT32, &sval), VX_TYPE_SCALAR);
+    ASSERT_VX_OBJECT(cn1   = vxConvertDepthNode(graph, src, src2, VX_CONVERT_POLICY_SATURATE, sshift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(cn2   = vxConvertDepthNode(graph, dst, dst2, VX_CONVERT_POLICY_SATURATE, sshift), VX_TYPE_NODE);
+    ASSERT_VX_OBJECT(tmp   = vxAddNode(graph, dst2, src2, VX_CONVERT_POLICY_WRAP, gr), VX_TYPE_NODE);
+
+    // test
+    target_format = VX_DF_IMAGE_U1;
+    inference_image = dst;
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxAssignNodeCallback(n, inference_image_test));
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseNode(&n));
+    VX_CALL(vxReleaseNode(&cn1));
+    VX_CALL(vxReleaseNode(&cn2));
+    VX_CALL(vxReleaseNode(&tmp));
+    VX_CALL(vxReleaseScalar(&sshift));
+    VX_CALL(vxReleaseImage(&src));
+    VX_CALL(vxReleaseImage(&dst));
+    VX_CALL(vxReleaseImage(&src2));
+    VX_CALL(vxReleaseImage(&dst2));
+    VX_CALL(vxReleaseImage(&gr));
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
 typedef struct {
     const char* name;
     uint32_t width;
     uint32_t height;
+    vx_df_image format;
 } size_arg;
 
-#define SIZE_ARG(w,h) ARG(#w "x" #h, w, h)
+#define SIZE_ARG_U8(w,h) ARG(#w "x" #h, w, h, VX_DF_IMAGE_U8)
+#define SIZE_ARG_U1(w,h) ARG("_U1_/" #w "x" #h, w, h, VX_DF_IMAGE_U1)
 
-#define NOT_SIZE_ARGS       \
-    SIZE_ARG(640, 480),     \
-    ARG_EXTENDED_BEGIN(),   \
-    SIZE_ARG(1, 1),         \
-    SIZE_ARG(15, 17),       \
-    SIZE_ARG(32, 32),       \
-    SIZE_ARG(1231, 1234),   \
-    SIZE_ARG(1280, 720),    \
-    SIZE_ARG(1920, 1080),   \
+#define NOT_SIZE_ARGS           \
+    SIZE_ARG_U8(640, 480),      \
+    SIZE_ARG_U1(640, 480),      \
+    ARG_EXTENDED_BEGIN(),       \
+    SIZE_ARG_U8(1, 1),          \
+    SIZE_ARG_U8(15, 17),        \
+    SIZE_ARG_U8(32, 32),        \
+    SIZE_ARG_U8(1231, 1234),    \
+    SIZE_ARG_U8(1280, 720),     \
+    SIZE_ARG_U8(1920, 1080),    \
+    SIZE_ARG_U1(1, 1),          \
+    SIZE_ARG_U1(15, 17),        \
+    SIZE_ARG_U1(32, 32),        \
+    SIZE_ARG_U1(1231, 1234),    \
+    SIZE_ARG_U1(1280, 720),     \
+    SIZE_ARG_U1(1920, 1080),    \
     ARG_EXTENDED_END()
 
 TEST_WITH_ARG(vxuNot, testSizes, size_arg, NOT_SIZE_ARGS)
 {
     vx_image src, dst;
-    CT_Image ref_src, refdst, vxdst;
+    CT_Image ref_src, ref_dst, vx_dst;
     vx_context context = context_->vx_context_;
 
     ASSERT_NO_FAILURE({
-        ref_src = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U8);
-        fillSquence(ref_src, (uint32_t)CT()->seed_);
+        ref_src = ct_allocate_image(arg_->width, arg_->height, arg_->format);
+        fillSequence(ref_src, (uint32_t)CT()->seed_);
         src = ct_image_to_vx_image(ref_src, context);
     });
 
-    ASSERT_VX_OBJECT(dst = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst = vxCreateImage(context, arg_->width, arg_->height, arg_->format), VX_TYPE_IMAGE);
 
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxuNot(context, src, dst));
 
     ASSERT_NO_FAILURE({
-        vxdst = ct_image_from_vx_image(dst);
-        refdst = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U8);
-        referenceNot(ref_src, refdst);
+        vx_dst = ct_image_from_vx_image(dst);
+        ref_dst = ct_allocate_image(arg_->width, arg_->height, arg_->format);
+        referenceNot(ref_src, ref_dst);
     });
 
-    ASSERT_EQ_CTIMAGE(refdst, vxdst);
+    ASSERT_EQ_CTIMAGE(ref_dst, vx_dst);
 
     // checked release vx images
     VX_CALL(vxReleaseImage(&dst));
@@ -188,19 +301,19 @@
 TEST_WITH_ARG(vxNot, testSizes, size_arg, NOT_SIZE_ARGS)
 {
     vx_image src, dst;
-    CT_Image ref_src, refdst, vxdst;
+    CT_Image ref_src, ref_dst, vx_dst;
     vx_graph graph;
     vx_context context = context_->vx_context_;
 
     ASSERT_NO_FAILURE({
-        ref_src = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U8);
-        fillSquence(ref_src, (uint32_t)CT()->seed_);
+        ref_src = ct_allocate_image(arg_->width, arg_->height, arg_->format);
+        fillSequence(ref_src, (uint32_t)CT()->seed_);
         src = ct_image_to_vx_image(ref_src, context);
     });
 
     // build one-node graph
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-    ASSERT_VX_OBJECT(dst   = vxCreateImage(context, arg_->width, arg_->height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst   = vxCreateImage(context, arg_->width, arg_->height, arg_->format), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(vxNotNode(graph, src, dst), VX_TYPE_NODE);
 
     // run graph
@@ -212,19 +325,26 @@
 #endif
 
     ASSERT_NO_FAILURE({
-        vxdst = ct_image_from_vx_image(dst);
-        refdst = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U8);
-        referenceNot(ref_src, refdst);
+        vx_dst  = ct_image_from_vx_image(dst);
+        ref_dst = ct_allocate_image(arg_->width, arg_->height, arg_->format);
+        referenceNot(ref_src, ref_dst);
     });
 
-    ASSERT_EQ_CTIMAGE(refdst, vxdst);
+    ASSERT_EQ_CTIMAGE(ref_dst, vx_dst);
 
     VX_CALL(vxReleaseImage(&src));
     VX_CALL(vxReleaseImage(&dst));
     VX_CALL(vxReleaseGraph(&graph));
 }
 
+TESTCASE_TESTS(vxuNot, DISABLED_testNegativeSizes,
+                       DISABLED_testNegativeSizes_U1_,
+                       testSizes)
 
-TESTCASE_TESTS(vxuNot, DISABLED_testNegativeSizes,                testSizes)
-TESTCASE_TESTS(vxNot,  DISABLED_testNegativeSizes, testInference, testSizes)
+TESTCASE_TESTS(vxNot,  DISABLED_testNegativeSizes,
+                       DISABLED_testNegativeSizes_U1_,
+                       testInference,
+                       testInference_U1_,
+                       testSizes)
 
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_object_array.c b/test_conformance/test_object_array.c
index 84e787e..9cf8c02 100644
--- a/test_conformance/test_object_array.c
+++ b/test_conformance/test_object_array.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
@@ -75,7 +77,7 @@
             exemplar = (vx_reference)vxCreateLUT(context, obj_item_type, lut_num_items);
             break;
         case VX_TYPE_THRESHOLD:
-            exemplar = (vx_reference)vxCreateThreshold(context, thresh_type, obj_item_type);
+            exemplar = (vx_reference)vxCreateThresholdForImage(context, thresh_type, format, format);
             break;
         default:
             break;
@@ -318,6 +320,75 @@
     ASSERT(object_array == 0);
 }
 
+#define ADD_VX_VIRTUAL_OBJECT_ARRAY_TYPES(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_IMAGE", __VA_ARGS__, VX_TYPE_IMAGE)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_ARRAY", __VA_ARGS__, VX_TYPE_ARRAY)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_TYPE_PYRAMID", __VA_ARGS__, VX_TYPE_PYRAMID))
+
+#define VIRTUAL_OBJECT_ARRAY_PARAMETERS \
+    CT_GENERATE_PARAMETERS("object_array", ADD_VX_VIRTUAL_OBJECT_ARRAY_TYPES, ARG, NULL)
+
+
+TEST_WITH_ARG(ObjectArray, test_vxCreateVirtualObjectArray, Obj_Array_Arg,
+              VIRTUAL_OBJECT_ARRAY_PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+
+    vx_reference exemplar = NULL;
+    vx_size num_items = OBJECT_ARRAY_NUM_ITEMS;
+    vx_enum item_type = arg_->item_type;
+
+    vx_graph graph = 0;
+    vx_object_array object_array = 0;
+
+    vx_reference actual_item = NULL;
+    vx_enum actual_type = VX_TYPE_INVALID;
+    vx_size actual_num_items = 0;
+
+    vx_uint32 i;
+
+    ASSERT_VX_OBJECT(exemplar = own_create_exemplar(context, item_type), (enum vx_type_e)item_type);
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    /* 1. check if object array can be created with allowed types*/
+    ASSERT_VX_OBJECT(object_array = vxCreateVirtualObjectArray(graph, exemplar, num_items), VX_TYPE_OBJECT_ARRAY);
+
+    /* 2. check if object array's actual item_type corresponds to requested item_type */
+    VX_CALL(vxQueryObjectArray(object_array, VX_OBJECT_ARRAY_ITEMTYPE, &actual_type, sizeof(actual_type)));
+    ASSERT_EQ_INT(item_type, actual_type);
+
+    /* 3. check if object array's actual item_size corresponds to requested item_type size */
+    VX_CALL(vxQueryObjectArray(object_array, VX_OBJECT_ARRAY_NUMITEMS, &actual_num_items, sizeof(actual_num_items)));
+    ASSERT_EQ_INT(num_items, actual_num_items);
+
+    /* 4. check meta formats of objects in object array */
+    for (i = 0u; i < num_items; i++)
+    {
+        ASSERT_VX_OBJECT(actual_item = vxGetObjectArrayItem(object_array, i), (enum vx_type_e)item_type);
+
+        ASSERT_NO_FAILURE(own_check_meta(actual_item, exemplar));
+
+        VX_CALL(vxReleaseReference(&actual_item));
+        ASSERT(actual_item == 0);
+    }
+
+    /* 5. check that we can't get item out of object array's range */
+    actual_item = vxGetObjectArrayItem(object_array, (vx_uint32)num_items);
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, vxGetStatus((vx_reference)actual_item));
+
+    VX_CALL(vxReleaseReference(&exemplar));
+    ASSERT(exemplar == 0);
+
+    VX_CALL(vxReleaseObjectArray(&object_array));
+    ASSERT(object_array == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT(graph == 0);
+}
+
 TESTCASE_TESTS(
     ObjectArray,
-    test_vxCreateObjectArray)
+    test_vxCreateObjectArray,
+    test_vxCreateVirtualObjectArray)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_optflowpyrlk.c b/test_conformance/test_optflowpyrlk.c
index ad0790d..9cc50aa 100644
--- a/test_conformance/test_optflowpyrlk.c
+++ b/test_conformance/test_optflowpyrlk.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -469,3 +471,5 @@
         testGraphProcessing,
         testImmediateProcessing
         )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_phase.c b/test_conformance/test_phase.c
index ae0e212..ff5f77d 100644
--- a/test_conformance/test_phase.c
+++ b/test_conformance/test_phase.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -213,3 +215,5 @@
 }
 
 TESTCASE_TESTS(Phase, testOnRandom)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_remap.c b/test_conformance/test_remap.c
index b28752d..fcf6e9c 100644
--- a/test_conformance/test_remap.c
+++ b/test_conformance/test_remap.c
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -243,7 +245,7 @@
             }
         }
 
-        vxCopyRemapPatch(map, &rect, stride_y, ptr_w, VX_TYPE_COORDINATES2DF, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);    
+        vxCopyRemapPatch(map, &rect, stride_y, ptr_w, VX_TYPE_COORDINATES2DF, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
         ct_free_mem(ptr_w);
     }
 
@@ -636,7 +638,7 @@
     {
         expected_status = VX_SUCCESS;
     }
-        
+
     if (status == VX_SUCCESS)
     {
         ASSERT_NO_FAILURE(output = ct_image_from_vx_image(output_image));
@@ -855,3 +857,4 @@
 TESTCASE_TESTS(vxCopyRemapPatch, testCopyRandomReamp)
 TESTCASE_TESTS(vxMapRemapPatch, testMapRandomRemap)
 
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_scalar.c b/test_conformance/test_scalar.c
index eb9944c..5c92d19 100644
--- a/test_conformance/test_scalar.c
+++ b/test_conformance/test_scalar.c
@@ -15,7 +15,10 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <math.h>
+#include <string.h>
 #include <float.h>
 #include <VX/vx.h>
 
@@ -42,6 +45,18 @@
     vx_bool     boolean;
     vx_uint8    data[8];
 
+    /* support type of scalar with size */
+    vx_rectangle_t rect;
+    vx_keypoint_t  key_point;
+    vx_coordinates2d_t coord2d;
+    vx_coordinates3d_t coord3d;
+#ifdef OPENVX_USE_ENHANCED_VISION
+    vx_coordinates2df_t coord2df;
+    vx_hog_t  hog;
+    vx_hough_lines_p_t houghlines;
+    vx_line2d_t line2d;
+    vx_tensor_matrix_multiply_params_t matrix;
+#endif
 } scalar_val;
 
 typedef struct
@@ -70,12 +85,268 @@
     case VX_TYPE_DF_IMAGE: val->fcc = variant == vx_true_e ? VX_DF_IMAGE_RGB : VX_DF_IMAGE_U8; break;
     case VX_TYPE_BOOL:     val->boolean = variant == vx_true_e ? vx_true_e : vx_false_e; break;
 
+    /* support type of scalar with size */
+    case VX_TYPE_RECTANGLE:
+        if (variant == vx_true_e)
+        {
+            val->rect.start_x = 0;
+            val->rect.start_y = 0;
+            val->rect.end_x = 1280;
+            val->rect.end_y = 720;
+        }
+        break;
+    case VX_TYPE_KEYPOINT:
+        if (variant == vx_true_e)
+        {
+            val->key_point.x = 128;
+            val->key_point.y = 256;
+            val->key_point.strength = 20.0;
+            val->key_point.scale = 0.8;
+            val->key_point.orientation = 0.3;
+            val->key_point.tracking_status = 1;
+            val->key_point.error = 0;
+        }
+        break;
+    case VX_TYPE_COORDINATES2D:
+        if (variant == vx_true_e)
+        {
+            val->coord2d.x = 10;
+            val->coord2d.y = 9;
+        }
+        break;
+    case VX_TYPE_COORDINATES3D:
+        if (variant == vx_true_e)
+        {
+            val->coord3d.x = 16;
+            val->coord3d.y = 31;
+            val->coord3d.z = 22;
+        }
+        break;
+#ifdef OPENVX_USE_ENHANCED_VISION
+    case VX_TYPE_COORDINATES2DF:
+        if (variant == vx_true_e)
+        {
+            val->coord2df.x = 2.7f;
+            val->coord2df.y = 3.5f;
+        }
+        break;
+    case VX_TYPE_HOG_PARAMS:
+        if (variant == vx_true_e)
+        {
+            val->hog.cell_width = 16;
+            val->hog.cell_height = 16;
+            val->hog.block_width = 128;
+            val->hog.block_height = 128;
+            val->hog.block_stride = 1280;
+            val->hog.num_bins = 5;
+            val->hog.window_width = 1280;
+            val->hog.window_height = 720;
+            val->hog.window_stride = 1280;
+            val->hog.threshold = 0.2f;
+        }
+        break;
+    case VX_TYPE_HOUGH_LINES_PARAMS:
+        if (variant == vx_true_e)
+        {
+            val->houghlines.rho = 0.8f;
+            val->houghlines.theta = 0.5f;
+            val->houghlines.threshold = 235;
+            val->houghlines.line_length = 8;
+            val->houghlines.line_gap = 3;
+            val->houghlines.theta_max = 1.2f;
+            val->houghlines.theta_min = 0.1f;
+        }
+        break;
+    case VX_TYPE_LINE_2D:
+        if (variant == vx_true_e)
+        {
+            val->line2d.start_x = 2.3f;
+            val->line2d.start_y = 1.5f;
+            val->line2d.end_x = 1279.9f;
+            val->line2d.end_y = 718.8f;
+        }
+        break;
+    case VX_TYPE_TENSOR_MATRIX_MULTIPLY_PARAMS:
+        if (variant == vx_true_e)
+        {
+            val->matrix.transpose_input1 = vx_true_e;
+            val->matrix.transpose_input2 = vx_false_e;
+            val->matrix.transpose_input3 = vx_true_e;
+        }
+        break;
+#endif
     default:
         FAIL("Unsupported type: (%.4s)", &type);
     }
     return;
 }
 
+static vx_size ownGetSizeByType(vx_enum type)
+{
+    vx_size size = 0;
+    switch (type)
+    {
+    case VX_TYPE_CHAR:     size = sizeof(vx_char); break;
+    case VX_TYPE_INT8:     size = sizeof(vx_int8); break;
+    case VX_TYPE_UINT8:    size = sizeof(vx_uint8); break;
+    case VX_TYPE_INT16:    size = sizeof(vx_int16); break;
+    case VX_TYPE_UINT16:   size = sizeof(vx_uint16); break;
+    case VX_TYPE_INT32:    size = sizeof(vx_int32); break;
+    case VX_TYPE_UINT32:   size = sizeof(vx_uint32); break;
+    case VX_TYPE_INT64:    size = sizeof(vx_int64); break;
+    case VX_TYPE_UINT64:   size = sizeof(vx_uint64); break;
+    case VX_TYPE_FLOAT32:  size = sizeof(vx_float32); break;
+    case VX_TYPE_FLOAT64:  size = sizeof(vx_float64); break;
+    case VX_TYPE_ENUM:     size = sizeof(vx_int32); break;
+    case VX_TYPE_SIZE:     size = sizeof(vx_size); break;
+    case VX_TYPE_DF_IMAGE: size = sizeof(vx_df_image); break;
+    case VX_TYPE_BOOL:     size = sizeof(vx_bool); break;
+
+    /* support type of scalar with size */
+    case VX_TYPE_RECTANGLE:
+        size = sizeof(vx_rectangle_t);
+        break;
+    case VX_TYPE_KEYPOINT:
+        size = sizeof(vx_keypoint_t);
+        break;
+    case VX_TYPE_COORDINATES2D:
+        size = sizeof(vx_coordinates2d_t);
+        break;
+    case VX_TYPE_COORDINATES3D:
+        size = sizeof(vx_coordinates3d_t);
+        break;
+#ifdef OPENVX_USE_ENHANCED_VISION
+    case VX_TYPE_COORDINATES2DF:
+        size = sizeof(vx_coordinates2df_t);
+        break;
+    case VX_TYPE_HOG_PARAMS:
+        size = sizeof(vx_hog_t);
+        break;
+    case VX_TYPE_HOUGH_LINES_PARAMS:
+        size = sizeof(vx_hough_lines_p_t);
+        break;
+    case VX_TYPE_LINE_2D:
+        size = sizeof(vx_line2d_t);
+        break;
+    case VX_TYPE_TENSOR_MATRIX_MULTIPLY_PARAMS:
+        size = sizeof(vx_tensor_matrix_multiply_params_t);
+        break;
+#endif
+    default:
+        CT_RecordFailureAtFormat("Unsupported type: (%.4s)", __FUNCTION__, __FILE__, __LINE__, &type);
+        break;
+    }
+    return size;
+}
+
+static void ownCheckScalarVal(vx_enum type, scalar_val *actual_val, scalar_val *expect_val)
+{
+    switch (type)
+    {
+    case VX_TYPE_CHAR:
+        ASSERT_EQ_INT(actual_val->chr, expect_val->chr);
+        break;
+
+    case VX_TYPE_INT8:
+        ASSERT_EQ_INT(actual_val->s08, expect_val->s08);
+        break;
+
+    case VX_TYPE_UINT8:
+        ASSERT_EQ_INT(actual_val->u08, expect_val->u08);
+        break;
+
+    case VX_TYPE_INT16:
+        ASSERT_EQ_INT(actual_val->s16, expect_val->s16);
+        break;
+
+    case VX_TYPE_UINT16:
+        ASSERT_EQ_INT(actual_val->u16, expect_val->u16);
+        break;
+
+    case VX_TYPE_INT32:
+        ASSERT_EQ_INT(actual_val->s32, expect_val->s32);
+        break;
+
+    case VX_TYPE_UINT32:
+        ASSERT_EQ_INT(actual_val->u32, expect_val->u32);
+        break;
+
+    case VX_TYPE_INT64:
+        ASSERT_EQ_INT(actual_val->s64, expect_val->s64);
+        break;
+
+    case VX_TYPE_UINT64:
+        ASSERT_EQ_INT(actual_val->u64, expect_val->u64);
+        break;
+
+    case VX_TYPE_FLOAT32:
+        ASSERT(fabs(actual_val->f32 - expect_val->f32) < 0.000001f);
+        break;
+
+    case VX_TYPE_FLOAT64:
+        ASSERT(fabs(actual_val->f64 - expect_val->f64) < 0.000001f);
+        break;
+
+    case VX_TYPE_DF_IMAGE:
+        ASSERT_EQ_INT(actual_val->fcc, expect_val->fcc);
+        break;
+
+    case VX_TYPE_ENUM:
+        ASSERT_EQ_INT(actual_val->enm, expect_val->enm);
+        break;
+
+    case VX_TYPE_SIZE:
+        ASSERT_EQ_INT(actual_val->size, expect_val->size);
+        break;
+
+    case VX_TYPE_BOOL:
+        ASSERT_EQ_INT(actual_val->boolean, expect_val->boolean);
+        break;
+
+    case VX_TYPE_RECTANGLE:
+        ASSERT_EQ_INT(memcmp(&actual_val->rect, &expect_val->rect, sizeof(VX_TYPE_RECTANGLE)), 0);
+        break;
+
+    case VX_TYPE_KEYPOINT:
+        ASSERT_EQ_INT(memcmp(&actual_val->key_point, &expect_val->key_point, sizeof(VX_TYPE_KEYPOINT)), 0);
+        break;
+
+    case VX_TYPE_COORDINATES2D:
+        ASSERT_EQ_INT(memcmp(&actual_val->coord2d, &expect_val->coord2d, sizeof(VX_TYPE_COORDINATES2D)), 0);
+        break;
+
+    case VX_TYPE_COORDINATES3D:
+        ASSERT_EQ_INT(memcmp(&actual_val->coord3d, &expect_val->coord3d, sizeof(VX_TYPE_COORDINATES3D)), 0);
+        break;
+
+#ifdef OPENVX_USE_ENHANCED_VISION
+    case VX_TYPE_COORDINATES2DF:
+        ASSERT_EQ_INT(memcmp(&actual_val->coord2df, &expect_val->coord2df, sizeof(VX_TYPE_COORDINATES2DF)), 0);
+        break;
+
+    case VX_TYPE_HOG_PARAMS:
+        ASSERT_EQ_INT(memcmp(&actual_val->hog, &expect_val->hog, sizeof(VX_TYPE_HOG_PARAMS)), 0);
+        break;
+
+    case VX_TYPE_HOUGH_LINES_PARAMS:
+        ASSERT_EQ_INT(memcmp(&actual_val->houghlines, &expect_val->houghlines, sizeof(VX_TYPE_HOUGH_LINES_PARAMS)), 0);
+        break;
+
+    case VX_TYPE_LINE_2D:
+        ASSERT_EQ_INT(memcmp(&actual_val->line2d, &expect_val->line2d, sizeof(VX_TYPE_LINE_2D)), 0);
+        break;
+
+    case VX_TYPE_TENSOR_MATRIX_MULTIPLY_PARAMS:
+        ASSERT_EQ_INT(memcmp(&actual_val->matrix, &expect_val->matrix, sizeof(VX_TYPE_TENSOR_MATRIX_MULTIPLY_PARAMS)), 0);
+        break;
+#endif
+    default:
+        FAIL("Unsupported type: (%.4s)", &type);
+        break;
+    }
+    return;
+}
+
 TEST_WITH_ARG(Scalar, testCreateScalar, format_arg,
     ARG_ENUM(VX_TYPE_CHAR),
     ARG_ENUM(VX_TYPE_INT8),
@@ -327,8 +598,166 @@
     return;
 } /* testCopyScalar() */
 
+TEST_WITH_ARG(Scalar, testCreateScalarWithSize, format_arg,
+    ARG_ENUM(VX_TYPE_CHAR),
+    ARG_ENUM(VX_TYPE_INT8),
+    ARG_ENUM(VX_TYPE_UINT8),
+    ARG_ENUM(VX_TYPE_INT16),
+    ARG_ENUM(VX_TYPE_UINT16),
+    ARG_ENUM(VX_TYPE_INT32),
+    ARG_ENUM(VX_TYPE_UINT32),
+    ARG_ENUM(VX_TYPE_INT64),
+    ARG_ENUM(VX_TYPE_UINT64),
+    ARG_ENUM(VX_TYPE_FLOAT32),
+    ARG_ENUM(VX_TYPE_FLOAT64),
+    ARG_ENUM(VX_TYPE_ENUM),
+    ARG_ENUM(VX_TYPE_SIZE),
+    ARG_ENUM(VX_TYPE_DF_IMAGE),
+    ARG_ENUM(VX_TYPE_BOOL),
+    ARG_ENUM(VX_TYPE_RECTANGLE),
+    ARG_ENUM(VX_TYPE_KEYPOINT),
+    ARG_ENUM(VX_TYPE_COORDINATES2D),
+    ARG_ENUM(VX_TYPE_COORDINATES3D),
+#ifdef OPENVX_USE_ENHANCED_VISION
+    ARG_ENUM(VX_TYPE_COORDINATES2DF),
+    ARG_ENUM(VX_TYPE_HOG_PARAMS),
+    ARG_ENUM(VX_TYPE_HOUGH_LINES_PARAMS),
+    ARG_ENUM(VX_TYPE_LINE_2D),
+    ARG_ENUM(VX_TYPE_TENSOR_MATRIX_MULTIPLY_PARAMS)
+#endif
+    )
+{
+    vx_context context = context_->vx_context_;
+    vx_scalar  scalar = 0;
+    vx_enum    ref_type = arg_->data_type;
+    scalar_val ref;
+    vx_size    ref_size = ownGetSizeByType(ref_type);
+
+    own_init_scalar_value(ref_type, &ref, vx_true_e);
+
+    ASSERT_VX_OBJECT(scalar = vxCreateScalarWithSize(context, ref_type, &ref, ref_size), VX_TYPE_SCALAR);
+
+    VX_CALL(vxReleaseScalar(&scalar));
+
+    ASSERT(scalar == 0);
+
+    return;
+}
+
+TEST_WITH_ARG(Scalar, testCopyScalarWithSize, format_arg,
+    ARG_ENUM(VX_TYPE_CHAR),
+    ARG_ENUM(VX_TYPE_INT8),
+    ARG_ENUM(VX_TYPE_UINT8),
+    ARG_ENUM(VX_TYPE_INT16),
+    ARG_ENUM(VX_TYPE_UINT16),
+    ARG_ENUM(VX_TYPE_INT32),
+    ARG_ENUM(VX_TYPE_UINT32),
+    ARG_ENUM(VX_TYPE_INT64),
+    ARG_ENUM(VX_TYPE_UINT64),
+    ARG_ENUM(VX_TYPE_FLOAT32),
+    ARG_ENUM(VX_TYPE_FLOAT64),
+    ARG_ENUM(VX_TYPE_ENUM),
+    ARG_ENUM(VX_TYPE_SIZE),
+    ARG_ENUM(VX_TYPE_DF_IMAGE),
+    ARG_ENUM(VX_TYPE_BOOL),
+    ARG_ENUM(VX_TYPE_RECTANGLE),
+    ARG_ENUM(VX_TYPE_KEYPOINT),
+    ARG_ENUM(VX_TYPE_COORDINATES2D),
+    ARG_ENUM(VX_TYPE_COORDINATES3D),
+#ifdef OPENVX_USE_ENHANCED_VISION
+    ARG_ENUM(VX_TYPE_COORDINATES2DF),
+    ARG_ENUM(VX_TYPE_HOG_PARAMS),
+    ARG_ENUM(VX_TYPE_HOUGH_LINES_PARAMS),
+    ARG_ENUM(VX_TYPE_LINE_2D),
+    ARG_ENUM(VX_TYPE_TENSOR_MATRIX_MULTIPLY_PARAMS)
+#endif
+    )
+{
+    vx_context context = context_->vx_context_;
+    vx_scalar  scalar = 0;
+    vx_enum    ref_type = arg_->data_type;
+    scalar_val ref;
+    vx_size    ref_size = ownGetSizeByType(ref_type);
+    scalar_val expect_ref;
+    scalar_val actual_ref;
+
+    own_init_scalar_value(ref_type, &ref, vx_true_e);
+
+    ASSERT_VX_OBJECT(scalar = vxCreateScalarWithSize(context, ref_type, &ref, ref_size), VX_TYPE_SCALAR);
+
+    //check result
+    VX_CALL(vxCopyScalarWithSize(scalar, ref_size, &expect_ref, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+    ownCheckScalarVal(ref_type, &ref, &expect_ref);
+
+    own_init_scalar_value(ref_type, &actual_ref, vx_false_e);
+    VX_CALL(vxCopyScalarWithSize(scalar, ref_size, &actual_ref, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+    VX_CALL(vxCopyScalarWithSize(scalar, ref_size, &expect_ref, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+    ownCheckScalarVal(ref_type, &actual_ref, &expect_ref);
+
+    VX_CALL(vxReleaseScalar(&scalar));
+
+    ASSERT(scalar == 0);
+
+    return;
+}
+
+TEST_WITH_ARG(Scalar, testCreateVirtualScalar, format_arg,
+    ARG_ENUM(VX_TYPE_CHAR),
+    ARG_ENUM(VX_TYPE_INT8),
+    ARG_ENUM(VX_TYPE_UINT8),
+    ARG_ENUM(VX_TYPE_INT16),
+    ARG_ENUM(VX_TYPE_UINT16),
+    ARG_ENUM(VX_TYPE_INT32),
+    ARG_ENUM(VX_TYPE_UINT32),
+    ARG_ENUM(VX_TYPE_INT64),
+    ARG_ENUM(VX_TYPE_UINT64),
+    ARG_ENUM(VX_TYPE_FLOAT32),
+    ARG_ENUM(VX_TYPE_FLOAT64),
+    ARG_ENUM(VX_TYPE_ENUM),
+    ARG_ENUM(VX_TYPE_SIZE),
+    ARG_ENUM(VX_TYPE_DF_IMAGE),
+    ARG_ENUM(VX_TYPE_BOOL),
+    ARG_ENUM(VX_TYPE_RECTANGLE),
+    ARG_ENUM(VX_TYPE_KEYPOINT),
+    ARG_ENUM(VX_TYPE_COORDINATES2D),
+    ARG_ENUM(VX_TYPE_COORDINATES3D),
+#ifdef OPENVX_USE_ENHANCED_VISION
+    ARG_ENUM(VX_TYPE_COORDINATES2DF),
+    ARG_ENUM(VX_TYPE_HOG_PARAMS),
+    ARG_ENUM(VX_TYPE_HOUGH_LINES_PARAMS),
+    ARG_ENUM(VX_TYPE_LINE_2D),
+    ARG_ENUM(VX_TYPE_TENSOR_MATRIX_MULTIPLY_PARAMS)
+#endif
+    )
+{
+    vx_context context = context_->vx_context_;
+    vx_scalar  scalar = 0;
+    vx_enum    ref_type = arg_->data_type;
+    vx_graph graph = 0;
+    vx_enum    expect_type = VX_TYPE_INVALID;
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(scalar = vxCreateVirtualScalar(graph, ref_type), VX_TYPE_SCALAR);
+
+    VX_CALL(vxQueryScalar(scalar, VX_SCALAR_TYPE, &expect_type, sizeof(vx_enum)));
+    EXPECT_EQ_INT(expect_type, ref_type);
+
+    VX_CALL(vxReleaseScalar(&scalar));
+    ASSERT(scalar == 0);
+
+    VX_CALL(vxReleaseGraph(&graph));
+    ASSERT(graph == 0);
+
+    return;
+}
+
 TESTCASE_TESTS(Scalar,
     testCreateScalar,
     testQueryScalar,
-    testCopyScalar
+    testCopyScalar,
+    testCreateScalarWithSize,
+    testCopyScalarWithSize,
+    testCreateVirtualScalar
     )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_scale.c b/test_conformance/test_scale.c
index 9b4d225..d5a9369 100644
--- a/test_conformance/test_scale.c
+++ b/test_conformance/test_scale.c
@@ -15,11 +15,15 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
-#include <math.h> // floorf
+#include <math.h>   // floorf
+
+#define MAX(a, b) ((a) < (b) ? (b) : (a))
 
 TESTCASE(Scale, CT_VXContext, ct_setup_vx_context, 0)
 
@@ -48,18 +52,21 @@
     ASSERT(src_image == 0);
 }
 
-
-static CT_Image scale_generate_random(const char* fileName, int width, int height)
+static CT_Image scale_generate_random(const char* fileName, int width, int height, vx_df_image format)
 {
     CT_Image image;
 
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 2));
+    else
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 256));
 
     return image;
 }
 
-static CT_Image _scale_generate_simple_gradient(int width, int height, int step_x, int step_y, int offset)
+static CT_Image _scale_generate_simple_gradient(int width, int height, int step_x, int step_y, int offset, vx_df_image format)
 {
     CT_Image image = NULL;
     uint32_t x, y;
@@ -67,61 +74,121 @@
     ASSERT_(return 0, step_x > 0);
     ASSERT_(return 0, step_y > 0);
 
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_image(width, height, VX_DF_IMAGE_U8));
+    ASSERT_NO_FAILURE_(return 0, image = ct_allocate_image(width, height, format));
 
     for (y = 0; y < image->height; y++)
     {
         for (x = 0; x < image->width; x++)
         {
-            uint8_t* ptr = CT_IMAGE_DATA_PTR_8U(image, x, y);
-            int v = offset + (y / step_y) + (x / step_x);
-            *ptr = (uint8_t)v;
+            uint8_t* ptr;
+            int v;
+            if (format == VX_DF_IMAGE_U1)
+            {
+                ptr = CT_IMAGE_DATA_PTR_1U(image, x, y);
+                v = MAX((offset + (y / step_y) + (x / step_x)) % 2, 0);
+                *ptr = (*ptr & ~(1 << (x % 8))) | (uint8_t)v << (x % 8);
+            }
+            else
+            {
+                ptr = CT_IMAGE_DATA_PTR_8U(image, x, y);
+                v = offset + (y / step_y) + (x / step_x);
+                *ptr = (uint8_t)v;
+            }
         }
     }
 
     return image;
 }
 
-static CT_Image scale_generate_gradient_2x2(const char* fileName, int width, int height)
+static CT_Image scale_generate_gradient_2x2(const char* fileName, int width, int height, vx_df_image format)
 {
-    return _scale_generate_simple_gradient(width, height, 2, 2, 0);
+    return _scale_generate_simple_gradient(width, height, 2, 2, 0, format);
 }
 
-static CT_Image scale_generate_gradient_16x16(const char* fileName, int width, int height)
+static CT_Image scale_generate_gradient_16x16(const char* fileName, int width, int height, vx_df_image format)
 {
-    return _scale_generate_simple_gradient(width, height, 16, 16, 32);
+    return _scale_generate_simple_gradient(width, height, 16, 16, 32, format);
 }
 
-static CT_Image scale_generate_pattern3x3(const char* fileName, int width, int height)
+static CT_Image scale_generate_pattern3x3(const char* fileName, int width, int height, vx_df_image format)
 {
     CT_Image image = NULL;
     uint32_t x, y;
 
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_image(width, height, VX_DF_IMAGE_U8));
+    ASSERT_NO_FAILURE_(return 0, image = ct_allocate_image(width, height, format));
 
     for (y = 0; y < image->height; y++)
     {
         for (x = 0; x < image->width; x++)
         {
-            uint8_t* ptr = CT_IMAGE_DATA_PTR_8U(image, x, y);
-            int v = ((y % 3) == 1 && (x % 3) == 1) ? 0 : 255;
-            *ptr = (uint8_t)v;
+            uint8_t* ptr;
+            int v;
+            if (format == VX_DF_IMAGE_U1)
+            {
+                ptr = CT_IMAGE_DATA_PTR_1U(image, x, y);
+                v = ((y % 3) == 1 && (x % 3) == 1) ? 0 : 1;
+                *ptr = (*ptr & ~(1 << (x % 8))) | (uint8_t)v << (x % 8);
+            }
+            else
+            {
+                ptr = CT_IMAGE_DATA_PTR_8U(image, x, y);
+                v = ((y % 3) == 1 && (x % 3) == 1) ? 0 : 255;
+                *ptr = (uint8_t)v;
+            }
         }
     }
 
     return image;
 }
 
-static CT_Image scale_read_image(const char* fileName, int width, int height)
+static CT_Image scale_read_image(const char* fileName, int width, int height, vx_df_image format)
 {
-    CT_Image image = NULL;
+    CT_Image image_load = NULL, image_ret = NULL;
     ASSERT_(return 0, width == 0 && height == 0);
-    image = ct_read_image(fileName, 1);
-    ASSERT_(return 0, image);
-    ASSERT_(return 0, image->format == VX_DF_IMAGE_U8);
-    return image;
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
+
+    image_load = ct_read_image(fileName, 1);
+    ASSERT_(return 0, image_load);
+    ASSERT_(return 0, image_load->format == VX_DF_IMAGE_U8);
+
+    if (format == VX_DF_IMAGE_U1)
+    {
+        ASSERT_NO_FAILURE_(return 0, threshold_U8_ct_image(image_load, 127));   // Threshold to make the U1 image less trivial
+        ASSERT_NO_FAILURE_(return 0, image_ret = ct_allocate_image(image_load->width, image_load->height, VX_DF_IMAGE_U1));
+        ASSERT_NO_FAILURE_(return 0, U8_ct_image_to_U1_ct_image(image_load, image_ret));
+    }
+    else
+    {
+        image_ret = image_load;
+    }
+
+    ASSERT_(return 0, image_ret);
+    ASSERT_(return 0, image_ret->format == format);
+
+    return image_ret;
+}
+
+static vx_int32 ct_image_get_pixel_1u(CT_Image img, int x, int y, vx_border_t border)
+{
+    int border_x_start = img->roi.x % 8;     // Bit-shift offset from ROI
+    if (border.mode == VX_BORDER_UNDEFINED)
+    {
+        if (x < border_x_start || x >= (int)img->width + border_x_start || y < 0 || y >= (int)img->height)
+            return -1; //border
+        return (*CT_IMAGE_DATA_PTR_1U(img, x, y) & (1 << (x % 8))) >> (x % 8);
+    }
+    else if (border.mode == VX_BORDER_REPLICATE)
+    {
+        return CT_IMAGE_DATA_REPLICATE_1U(img, x, y);
+    }
+    else if (border.mode == VX_BORDER_CONSTANT)
+    {
+        return CT_IMAGE_DATA_CONSTANT_1U(img, x, y, border.constant_value.U1);
+    }
+    else
+    {
+        CT_FAIL_(return -1, "Invalid border type");
+    }
 }
 
 static vx_int32 ct_image_get_pixel_8u(CT_Image img, int x, int y, vx_border_t border)
@@ -148,10 +215,23 @@
 
 static int scale_check_pixel(CT_Image src, CT_Image dst, int x, int y, vx_enum interpolation, vx_border_t border)
 {
-    vx_uint8 res = *CT_IMAGE_DATA_PTR_8U(dst, x, y);
-    vx_float32 x_src = (((vx_float32)x + 0.5f) * (vx_float32)src->width / (vx_float32)dst->width) - 0.5f;
-    vx_float32 y_src = (((vx_float32)y + 0.5f) * (vx_float32)src->height / (vx_float32)dst->height) - 0.5f;
-    int x_min = (int)floorf(x_src), y_min = (int)floorf(y_src);
+    ASSERT_(return 0, src->format == dst->format && (src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8));
+    vx_df_image format = src->format;
+    vx_uint8 res;
+    if (format == VX_DF_IMAGE_U1)
+        res = (*CT_IMAGE_DATA_PTR_1U(dst, x, y) & (1 << (x % 8))) >> (x % 8);
+    else
+        res =  *CT_IMAGE_DATA_PTR_8U(dst, x, y);
+
+    int x_dst = x + dst->roi.x - (format == VX_DF_IMAGE_U1 ? dst->roi.x % 8 : 0);   // ROI-independent coordinates
+    int y_dst = y + dst->roi.y;
+    vx_float32 x_src = (((vx_float32)x_dst + 0.5f) * (vx_float32)src->roi.width  / (vx_float32)dst->roi.width)  - 0.5f;
+    vx_float32 y_src = (((vx_float32)y_dst + 0.5f) * (vx_float32)src->roi.height / (vx_float32)dst->roi.height) - 0.5f;
+    x_src = x_src - src->roi.x + (format == VX_DF_IMAGE_U1 ? src->roi.x % 8 : 0);   // ROI-dependent coordinates
+    y_src = y_src - src->roi.y;
+    int x_min = (int)floorf(x_src);
+    int y_min = (int)floorf(y_src);
+
     if (interpolation == VX_INTERPOLATION_NEAREST_NEIGHBOR)
     {
         int sx, sy;
@@ -160,21 +240,36 @@
             for (sx = -1; sx <= 1; sx++)
             {
                 vx_int32 candidate = 0;
-                ASSERT_NO_FAILURE_(return 0, candidate = ct_image_get_pixel_8u(src, x_min + sx, y_min + sy, border));
+                if (format == VX_DF_IMAGE_U1)
+                    ASSERT_NO_FAILURE_(return 0, candidate = ct_image_get_pixel_1u(src, x_min + sx, y_min + sy, border));
+                else
+                    ASSERT_NO_FAILURE_(return 0, candidate = ct_image_get_pixel_8u(src, x_min + sx, y_min + sy, border));
+
                 if (candidate == -1 || candidate == res)
                     return 1;
             }
         }
         CT_FAIL_(return 0, "Check failed for pixel (%d, %d): %d", x, y, (int)res);
     }
-    if (interpolation == VX_INTERPOLATION_BILINEAR)
+    else if (interpolation == VX_INTERPOLATION_BILINEAR)
     {
         vx_float32 s = x_src - x_min;
         vx_float32 t = y_src - y_min;
-        vx_int32 p00 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 0, border);
-        vx_int32 p01 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 1, border);
-        vx_int32 p10 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 0, border);
-        vx_int32 p11 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 1, border);
+        vx_int32 p00, p01, p10, p11;
+        if (format == VX_DF_IMAGE_U1)
+        {
+            p00 = ct_image_get_pixel_1u(src, x_min + 0, y_min + 0, border);
+            p01 = ct_image_get_pixel_1u(src, x_min + 0, y_min + 1, border);
+            p10 = ct_image_get_pixel_1u(src, x_min + 1, y_min + 0, border);
+            p11 = ct_image_get_pixel_1u(src, x_min + 1, y_min + 1, border);
+        }
+        else
+        {
+            p00 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 0, border);
+            p01 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 1, border);
+            p10 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 0, border);
+            p11 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 1, border);
+        }
         vx_float32 ref_float;
         vx_int32 ref;
 
@@ -210,15 +305,17 @@
         // Take the nearest integer to avoid problems with casts in case of float rounding errors
         // (e.g: 30.999999 should give 31, not 30)
         ref = (vx_int32)(ref_float + 0.5f);
+        if (format == VX_DF_IMAGE_U1)
+            ref = (ref > 1) ? 1 : (ref < 0) ? 0 : ref;
 
-        // A difference of 1 is allowed
-        if (abs(res - ref) <= 1) {
+        // A difference of 1 is allowed (for U1 only a difference of 0 is allowed, otherwise the test is trivial)
+        if (abs(res - ref) <= (format == VX_DF_IMAGE_U1 ? 0 : 1)) {
             return 1;
         }
 
         return 0; // don't generate failure, we will check num failed pixels later
     }
-    if (interpolation == VX_INTERPOLATION_AREA)
+    else if (interpolation == VX_INTERPOLATION_AREA)
     {
         vx_int32 v_min = 256, v_max = -1;
         int sx, sy;
@@ -228,7 +325,11 @@
             for (sx = -2; sx <= 2; sx++)
             {
                 vx_int32 candidate = 0;
-                ASSERT_NO_FAILURE_(return 0, candidate = ct_image_get_pixel_8u(src, x_min + sx, y_min + sy, border));
+                if (format == VX_DF_IMAGE_U1)
+                    ASSERT_NO_FAILURE_(return 0, candidate = ct_image_get_pixel_1u(src, x_min + sx, y_min + sy, border));
+                else
+                    ASSERT_NO_FAILURE_(return 0, candidate = ct_image_get_pixel_8u(src, x_min + sx, y_min + sy, border));
+
                 if (candidate == -1)
                     return 1;
                 if (v_min > candidate)
@@ -241,14 +342,29 @@
         }
         CT_FAIL_(return 0, "Check failed for pixel (%d, %d): %d", x, y, (int)res);
     }
-    CT_FAIL_(return 0, "NOT IMPLEMENTED");
+    else
+    {
+        CT_FAIL_(return 0, "NOT IMPLEMENTED");
+    }
 }
 
 static int scale_check_pixel_exact(CT_Image src, CT_Image dst, int x, int y, vx_enum interpolation, vx_border_t border)
 {
-    vx_uint8 res = *CT_IMAGE_DATA_PTR_8U(dst, x, y);
-    vx_float32 x_src = (((vx_float32)x + 0.5f) * (vx_float32)src->width / (vx_float32)dst->width) - 0.5f;
-    vx_float32 y_src = (((vx_float32)y + 0.5f) * (vx_float32)src->height / (vx_float32)dst->height) - 0.5f;
+    ASSERT_(return 0, src->format == dst->format && (src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8));
+    vx_df_image format = src->format;
+    vx_uint8 res;
+    if (format == VX_DF_IMAGE_U1)
+        res = (*CT_IMAGE_DATA_PTR_1U(dst, x, y) & (1 << (x % 8))) >> (x % 8);
+    else
+        res =  *CT_IMAGE_DATA_PTR_8U(dst, x, y);
+
+    int x_dst = x + dst->roi.x - (format == VX_DF_IMAGE_U1 ? dst->roi.x % 8 : 0);   // ROI-independent coordinates
+    int y_dst = y + dst->roi.y;
+    vx_float32 x_src = (((vx_float32)x_dst + 0.5f) * (vx_float32)src->roi.width  / (vx_float32)dst->roi.width)  - 0.5f;
+    vx_float32 y_src = (((vx_float32)y_dst + 0.5f) * (vx_float32)src->roi.height / (vx_float32)dst->roi.height) - 0.5f;
+    x_src = x_src - src->roi.x + (format == VX_DF_IMAGE_U1 ? src->roi.x % 8 : 0);   // ROI-dependent coordinates
+    y_src = y_src - src->roi.y;
+
     vx_float32 x_minf = floorf(x_src);
     vx_float32 y_minf = floorf(y_src);
     int x_min = (vx_int32)x_minf;
@@ -259,21 +375,37 @@
         x_ref++;
     if (y_src - y_minf >= 0.5f)
         y_ref++;
+
     if (interpolation == VX_INTERPOLATION_NEAREST_NEIGHBOR)
     {
-        vx_int32 ref = ct_image_get_pixel_8u(src, x_ref, y_ref, border);
+        vx_int32 ref;
+        if (format == VX_DF_IMAGE_U1)
+            ref = ct_image_get_pixel_1u(src, x_ref, y_ref, border);
+        else
+            ref = ct_image_get_pixel_8u(src, x_ref, y_ref, border);
         if (ref == -1 || ref == res)
             return 1;
         CT_FAIL_(return 0, "Check failed for pixel (%d, %d): %d (expected %d)", x, y, (int)res, (int)ref);
     }
-    if (interpolation == VX_INTERPOLATION_BILINEAR)
+    else if (interpolation == VX_INTERPOLATION_BILINEAR)
     {
         vx_float32 s = x_src - x_minf;
         vx_float32 t = y_src - y_minf;
-        vx_int32 p00 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 0, border);
-        vx_int32 p01 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 1, border);
-        vx_int32 p10 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 0, border);
-        vx_int32 p11 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 1, border);
+        vx_int32 p00, p01, p10, p11;
+        if (format == VX_DF_IMAGE_U1)
+        {
+            p00 = ct_image_get_pixel_1u(src, x_min + 0, y_min + 0, border);
+            p01 = ct_image_get_pixel_1u(src, x_min + 0, y_min + 1, border);
+            p10 = ct_image_get_pixel_1u(src, x_min + 1, y_min + 0, border);
+            p11 = ct_image_get_pixel_1u(src, x_min + 1, y_min + 1, border);
+        }
+        else
+        {
+            p00 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 0, border);
+            p01 = ct_image_get_pixel_8u(src, x_min + 0, y_min + 1, border);
+            p10 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 0, border);
+            p11 = ct_image_get_pixel_8u(src, x_min + 1, y_min + 1, border);
+        }
         vx_float32 ref_float;
         vx_int32 ref;
 
@@ -309,6 +441,8 @@
         // Take the nearest integer to avoid problems with casts in case of float rounding errors
         // (e.g: 30.999999 should give 31, not 30)
         ref = (vx_int32)(ref_float + 0.5f);
+        if (format == VX_DF_IMAGE_U1)
+            ref = (ref > 1) ? 1 : (ref < 0) ? 0 : ref;
 
         // The result must be exact
         if (ref == res) {
@@ -317,39 +451,64 @@
 
         CT_FAIL_(return 0, "Check failed for pixel (%d, %d): %d (expected %d)", x, y, (int)res, (int)ref);
     }
-    if (interpolation == VX_INTERPOLATION_AREA)
+    else if (interpolation == VX_INTERPOLATION_AREA)
     {
         vx_int32 ref;
         ASSERT_(return 0, dst->width % src->width == 0 && dst->height % src->height == 0);
-        ref = ct_image_get_pixel_8u(src, x_ref, y_ref, border);
+        if (format == VX_DF_IMAGE_U1)
+            ref = ct_image_get_pixel_1u(src, x_ref, y_ref, border);
+        else
+            ref = ct_image_get_pixel_8u(src, x_ref, y_ref, border);
+
         if (ref == -1)
             return 1;
         if (ref == res)
             return 1;
         CT_FAIL_(return 0, "Check failed for pixel (%d, %d): %d (expected %d)", x, y, (int)res, (int)ref);
     }
-    CT_FAIL_(return 0, "NOT IMPLEMENTED");
+    else
+    {
+        CT_FAIL_(return 0, "NOT IMPLEMENTED");
+    }
 }
 
 static void scale_validate(CT_Image src, CT_Image dst, vx_enum interpolation, vx_border_t border, int exact)
 {
     int num_failed = 0;
+    ASSERT(src->format == dst->format && (src->format == VX_DF_IMAGE_U1 || src->format == VX_DF_IMAGE_U8));
     if (src->width == dst->width && src->height == dst->height) // special case for scale=1.0
     {
         ASSERT_EQ_CTIMAGE(src, dst);
         return;
     }
-    CT_FILL_IMAGE_8U(, dst,
-            {
-                int check;
-                if (exact == 0)
-                    ASSERT_NO_FAILURE(check = scale_check_pixel(src, dst, x, y, interpolation, border));
-                else
-                    ASSERT_NO_FAILURE(check = scale_check_pixel_exact(src, dst, x, y, interpolation, border));
-                if (check == 0) {
-                    num_failed++;
-                }
-            });
+    if (src->format == VX_DF_IMAGE_U1)
+    {
+        CT_FILL_IMAGE_1U(, dst,
+                {
+                    int check;
+                    if (exact == 0)
+                        ASSERT_NO_FAILURE(check = scale_check_pixel(src, dst, xShftd, y, interpolation, border));
+                    else
+                        ASSERT_NO_FAILURE(check = scale_check_pixel_exact(src, dst, xShftd, y, interpolation, border));
+                    if (check == 0) {
+                        num_failed++;
+                    }
+                });
+    }
+    else
+    {
+        CT_FILL_IMAGE_8U(, dst,
+                {
+                    int check;
+                    if (exact == 0)
+                        ASSERT_NO_FAILURE(check = scale_check_pixel(src, dst, x, y, interpolation, border));
+                    else
+                        ASSERT_NO_FAILURE(check = scale_check_pixel_exact(src, dst, x, y, interpolation, border));
+                    if (check == 0) {
+                        num_failed++;
+                    }
+                });
+    }
     if (interpolation == VX_INTERPOLATION_BILINEAR)
     {
         int total = dst->width * dst->height;
@@ -379,11 +538,12 @@
     const char* testName;
     int dummy;
     vx_enum interpolation;
-    CT_Image (*generator)(const char* fileName, int width, int height);
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     void (*dst_size_generator)(int width, int height, int* dst_width, int* dst_height);
     int exact_result;
     int width, height;
+    vx_df_image format;
     vx_border_t border;
 } Arg;
 
@@ -454,7 +614,10 @@
 
 #define SCALE_TEST(interpolation, inputDataGenerator, inputDataFile, scale, exact, nextmacro, ...) \
     CT_EXPAND(nextmacro(STR_##interpolation "/" inputDataFile "/" #scale, __VA_ARGS__, \
-            interpolation, inputDataGenerator, inputDataFile, dst_size_generator_ ## scale, exact))
+            interpolation, inputDataGenerator, inputDataFile, dst_size_generator_##scale, exact))
+#define SCALE_TEST_U1(interpolation, inputDataGenerator, inputDataFile, scale, exact, nextmacro, ...) \
+    CT_EXPAND(nextmacro("_U1_/" STR_##interpolation "/" inputDataFile "/" #scale, __VA_ARGS__, \
+            interpolation, inputDataGenerator, inputDataFile, dst_size_generator_##scale, exact))
 
 #define ADD_DST_SIZE_NN(testArgName, nextmacro, ...) \
     CT_EXPAND(nextmacro(testArgName "/1_1", __VA_ARGS__, dst_size_generator_1_1)), \
@@ -483,44 +646,84 @@
 
 #define PARAMETERS \
     /* 1:1 scale */ \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* NN upscale with integer factor */ \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_2, 1, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_3, 1, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 1_2, 1, ADD_SIZE_NONE, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_2, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_3, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image,    "lena.bmp", 1_2, 1, ADD_SIZE_NONE,      ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* NN downscale with odd integer factor */\
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 3_1, 1, ADD_SIZE_96x96, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 5_1, 1, ADD_SIZE_100x100, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_pattern3x3, "pattern3x3", 3_1, 1, ADD_SIZE_96x96, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 3_1, 0, ADD_SIZE_NONE, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 3_1, 1, ADD_SIZE_96x96,     ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 5_1, 1, ADD_SIZE_100x100,   ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_pattern3x3, "pattern3x3", 3_1, 1, ADD_SIZE_96x96, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image,    "lena.bmp", 3_1, 0, ADD_SIZE_NONE,      ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* other NN downscales */ \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 2_1, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_PYRAMID_ORB, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 2_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_PYRAMID_ORB, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* BILINEAR upscale with integer factor */ \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_2, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_3, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_2, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_3, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* BILINEAR downscales */ \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 2_1, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 3_1, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 5_1, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_PYRAMID_ORB, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 2_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 3_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 5_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_PYRAMID_ORB, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* AREA tests */ \
-    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_gradient_16x16, "gradient16x16", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_read_image, "lena.bmp", 4_1, 0, ADD_SIZE_NONE, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_gradient_16x16, "gradient16x16", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_read_image,    "lena.bmp", 4_1, 0, ADD_SIZE_NONE,      ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* AREA upscale */ \
-    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_2, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_3, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_2, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_3, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
     /* other */ \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_NEAR_UP, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_NEAR_UP, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", SCALE_NEAR_UP, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
-    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_NEAR_UP,   0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_NEAR_UP,   0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", SCALE_NEAR_UP,   0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA,             scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U8, ADD_VX_BORDERS, ARG, 0), \
+    \
+    /* U1: 1:1 scale */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_1, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: NN upscale with integer factor */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_2, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 1_3, 1, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image,    "lena.bmp", 1_2, 1, ADD_SIZE_NONE,      ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: NN downscale with odd integer factor */\
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 3_1, 1, ADD_SIZE_96x96,     ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 5_1, 1, ADD_SIZE_100x100,   ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_pattern3x3, "pattern3x3", 3_1, 1, ADD_SIZE_96x96, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image,    "lena.bmp", 3_1, 0, ADD_SIZE_NONE,      ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: other NN downscales */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 2_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_PYRAMID_ORB, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: BILINEAR upscale with integer factor */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_2, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 1_3, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: BILINEAR downscales */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 2_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 3_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", 5_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_PYRAMID_ORB, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: AREA tests */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA,             scale_generate_gradient_16x16, "gradient16x16", 4_1, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA,             scale_read_image,    "lena.bmp", 4_1, 0, ADD_SIZE_NONE,      ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: AREA upscale */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_2, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA,             scale_generate_random, "random", 1_3, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    /* U1: other */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_NEAR_UP,   0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_NEAR_UP,   0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA,             scale_generate_random, "random", SCALE_NEAR_UP,   0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR,         scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA,             scale_generate_random, "random", SCALE_NEAR_DOWN, 0, ADD_SIZE_SMALL_SET, ADD_TYPE_U1, ADD_VX_BORDERS_U1, ARG, 0)
 
 TEST_WITH_ARG(Scale, testGraphProcessing, Arg,
     PARAMETERS
@@ -534,12 +737,12 @@
 
     CT_Image src = NULL, dst = NULL;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
     ASSERT_NO_FAILURE(arg_->dst_size_generator(src->width, src->height, &dst_width, &dst_height));
 
-    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, dst_width, dst_height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, dst_width, dst_height, arg_->format), VX_TYPE_IMAGE);
 
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
 
@@ -577,12 +780,12 @@
 
     CT_Image src = NULL, dst = NULL;
 
-    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height));
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
     ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
 
     ASSERT_NO_FAILURE(arg_->dst_size_generator(src->width, src->height, &dst_width, &dst_height));
 
-    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, dst_width, dst_height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, dst_width, dst_height, arg_->format), VX_TYPE_IMAGE);
 
     VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &arg_->border, sizeof(arg_->border)));
 
@@ -599,4 +802,95 @@
     ASSERT(src_image == 0);
 }
 
-TESTCASE_TESTS(Scale, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+typedef struct {
+    const char* testName;
+    int dummy;
+    vx_enum interpolation;
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    void (*dst_size_generator)(int width, int height, int* dst_width, int* dst_height);
+    int exact_result;
+    int width, height;
+    vx_df_image format;
+    vx_border_t border;
+    vx_rectangle_t regionShift;
+} ValidRegionTest_Arg;
+
+#define REGION_PARAMETERS \
+    /* NN scaling */ \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 1_1, 1, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 1_2, 1, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 1_3, 1, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 2_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 4_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    /* Bilinear scaling */ \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 1_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 1_2, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 1_3, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 2_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 4_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    /* Area scaling */ \
+    SCALE_TEST(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 1_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 1_2, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 1_3, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 2_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 4_1, 0, ADD_SIZE_NONE, ADD_TYPE_U8, ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    /* U1: NN scaling */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 1_1, 1, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 1_2, 1, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 1_3, 1, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 2_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_NEAREST_NEIGHBOR, scale_read_image, "lena.bmp", 4_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    /* U1: Bilinear scaling */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 1_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 1_2, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 1_3, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 2_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_BILINEAR, scale_read_image, "lena.bmp", 4_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    /* U1: Area scaling */ \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 1_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 1_2, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 1_3, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 2_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0), \
+    SCALE_TEST_U1(VX_INTERPOLATION_AREA, scale_read_image, "lena.bmp", 4_1, 0, ADD_SIZE_NONE, ADD_TYPE_U1, ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY, ADD_VALID_REGION_SHRINKS, ARG, 0)
+
+TEST_WITH_ARG(Scale, testWithValidRegion, ValidRegionTest_Arg,
+    REGION_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    int dst_width = 0, dst_height = 0;
+    vx_image src_image = 0, dst_image = 0;
+
+    CT_Image src = NULL, dst = NULL;
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->regionShift;
+
+    ASSERT_NO_FAILURE(src = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+    ASSERT_VX_OBJECT(src_image = ct_image_to_vx_image(src, context), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(arg_->dst_size_generator(src->width, src->height, &dst_width, &dst_height));
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, dst_width, dst_height, arg_->format), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(src_image, &rect));
+    ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(src_image, &rect));
+
+    VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &arg_->border, sizeof(arg_->border)));
+
+    VX_CALL(vxuScaleImage(context, src_image, dst_image, arg_->interpolation));
+
+    ASSERT_NO_FAILURE(dst = ct_image_from_vx_image(dst_image));
+
+    ASSERT_NO_FAILURE(ct_adjust_roi(src, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+    ASSERT_NO_FAILURE(scale_check(src, dst, arg_->interpolation, arg_->border, arg_->exact_result));
+
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TESTCASE_TESTS(Scale, testNodeCreation, testGraphProcessing, testImmediateProcessing, testWithValidRegion)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_smoke.c b/test_conformance/test_smoke.c
index 313ae5d..fd85dd2 100644
--- a/test_conformance/test_smoke.c
+++ b/test_conformance/test_smoke.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -20,6 +20,8 @@
 #include <VX/vxu.h>
 #include <string.h>
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 TESTCASE(SmokeTest, CT_VXContext, ct_setup_vx_context, 0)
 
 typedef struct _mystruct {
@@ -80,38 +82,6 @@
     vx_reference ref = 0;
 
     {
-        /* test context reference */
-        ref = (vx_reference)context;
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
-        VX_CALL(vxRetainReference(ref));
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
-        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
-        VX_CALL(vxReleaseReference(&ref));
-        ref = (vx_reference)context;
-        ref_count1 = 0;
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
-        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
-    }
-
-    {
-        /* test graph reference */
-        vx_graph graph = 0;
-        EXPECT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-        ref = (vx_reference)graph;
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
-        VX_CALL(vxRetainReference(ref));
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
-        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
-        VX_CALL(vxReleaseReference(&ref));
-        ref = (vx_reference)graph;
-        ref_count1 = 0;
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
-        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
-
-        VX_CALL(vxReleaseGraph(&graph));
-    }
-
-    {
         /* test node reference */
         vx_graph graph = 0;
         vx_node node = 0;
@@ -232,24 +202,6 @@
     }
 
     {
-        /* test graph reference */
-        vx_graph graph = 0;
-        EXPECT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
-        ref = (vx_reference)graph;
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
-        VX_CALL(vxRetainReference(ref));
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
-        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
-        VX_CALL(vxReleaseReference(&ref));
-        ref = (vx_reference)graph;
-        ref_count1 = 0;
-        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
-        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
-
-        VX_CALL(vxReleaseGraph(&graph));
-    }
-
-    {
         /* test matrix reference */
         vx_matrix matrix = 0;
         EXPECT_VX_OBJECT(matrix = vxCreateMatrix(context, VX_TYPE_FLOAT32, 32, 32), VX_TYPE_MATRIX);
@@ -325,7 +277,7 @@
     {
         /* test threshold reference */
         vx_threshold threshold = 0;
-        EXPECT_VX_OBJECT(threshold = vxCreateThreshold(context, VX_THRESHOLD_TYPE_BINARY, VX_TYPE_UINT8), VX_TYPE_THRESHOLD);
+        EXPECT_VX_OBJECT(threshold = vxCreateThresholdForImage(context, VX_THRESHOLD_TYPE_BINARY, VX_DF_IMAGE_U8, VX_DF_IMAGE_U8), VX_TYPE_THRESHOLD);
         ref = (vx_reference)threshold;
         ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
         VX_CALL(vxRetainReference(ref));
@@ -406,122 +358,50 @@
 TEST(SmokeTest, test_vxRetainReference)
 {
     vx_image image = 0;
-    vx_graph graph = 0;
-    vx_reference image_ref = 0, graph_ref = 0;
-    vx_uint32 image_count = 0, graph_count = 0;
+    vx_reference image_ref = 0;
+    vx_uint32 image_count = 0;
     vx_context context = context_->vx_context_;
     vx_uint32 num_refs1 = 0, num_refs2 = 0, num_refs3 = 0, num_refs4 = 0;
 
     ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs1, sizeof(num_refs1)), VX_SUCCESS);
 
     ASSERT_VX_OBJECT(image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
 
     ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs2, sizeof(num_refs2)), VX_SUCCESS);
-    ASSERT_EQ_INT(num_refs2, num_refs1+2);
+    ASSERT_EQ_INT(num_refs2, num_refs1+1);
 
     image_ref = (vx_reference)image;
-    graph_ref = (vx_reference)graph;
     ASSERT_EQ_VX_STATUS(vxQueryReference(image_ref, VX_REFERENCE_COUNT, (void*)&image_count, sizeof(image_count)), VX_SUCCESS);
-    ASSERT_EQ_VX_STATUS(vxQueryReference(graph_ref, VX_REFERENCE_COUNT, (void*)&graph_count, sizeof(graph_count)), VX_SUCCESS);
     ASSERT_EQ_INT(image_count, 1);
-    ASSERT_EQ_INT(graph_count, 1);
 
     image_ref = (vx_reference)image;
-    graph_ref = (vx_reference)graph;
     VX_CALL(vxRetainReference(image_ref));
-    VX_CALL(vxRetainReference(graph_ref));
 
     image_ref = (vx_reference)image;
-    graph_ref = (vx_reference)graph;
     ASSERT_EQ_VX_STATUS(vxQueryReference(image_ref, VX_REFERENCE_COUNT, (void*)&image_count, sizeof(image_count)), VX_SUCCESS);
-    ASSERT_EQ_VX_STATUS(vxQueryReference(graph_ref, VX_REFERENCE_COUNT, (void*)&graph_count, sizeof(graph_count)), VX_SUCCESS);
     ASSERT_EQ_INT(image_count, 2);
-    ASSERT_EQ_INT(graph_count, 2);
 
     image_ref = (vx_reference)image;
-    graph_ref = (vx_reference)graph;
     VX_CALL(vxReleaseReference(&image_ref));
-    VX_CALL(vxReleaseReference(&graph_ref));
 
     ASSERT_EQ_PTR(0, image_ref);
-    ASSERT_EQ_PTR(0, graph_ref);
 
     image_ref = (vx_reference)image;
-    graph_ref = (vx_reference)graph;
     ASSERT_EQ_VX_STATUS(vxQueryReference(image_ref, VX_REFERENCE_COUNT, (void*)&image_count, sizeof(image_count)), VX_SUCCESS);
-    ASSERT_EQ_VX_STATUS(vxQueryReference(graph_ref, VX_REFERENCE_COUNT, (void*)&graph_count, sizeof(graph_count)), VX_SUCCESS);
     ASSERT_EQ_INT(image_count, 1);
-    ASSERT_EQ_INT(graph_count, 1);
 
     ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs3, sizeof(num_refs3)), VX_SUCCESS);
-    ASSERT_EQ_INT(num_refs3, num_refs1+2);
+    ASSERT_EQ_INT(num_refs3, num_refs1+1);
 
     image_ref = (vx_reference)image;
-    graph_ref = (vx_reference)graph;
     VX_CALL(vxReleaseReference(&image_ref));
-    VX_CALL(vxReleaseReference(&graph_ref));
 
     ASSERT_EQ_PTR(0, image_ref);
-    ASSERT_EQ_PTR(0, graph_ref);
 
     ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs4, sizeof(num_refs4)), VX_SUCCESS);
     ASSERT_EQ_INT(num_refs4, num_refs1);
 }
 
-TEST(SmokeTest, test_vxUnloadKernels)
-{
-    vx_context context = context_->vx_context_;
-    vx_kernel kernel = NULL;
-    vx_int32 num_modules1;
-    vx_int32 num_modules2;
-    vx_int32 num_unique_kernels1;
-    vx_int32 num_unique_kernels2;
-
-    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_modules1, sizeof(num_modules1)), VX_SUCCESS);
-    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, (void*)&num_unique_kernels1, sizeof(num_unique_kernels1)), VX_SUCCESS);
-    ASSERT(num_modules1 >= 0u);
-    ASSERT(num_unique_kernels1 > 0u);
-
-    kernel = vxGetKernelByName(context, "org.khronos.test.testmodule");
-    ASSERT_NE_VX_STATUS(VX_SUCCESS, vxGetStatus((vx_reference)kernel));
-
-    VX_CALL(vxLoadKernels(context, "test-testmodule"));
-    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, "org.khronos.test.testmodule"), VX_TYPE_KERNEL);
-    VX_CALL(vxReleaseKernel(&kernel));
-
-    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_modules2, sizeof(num_modules1)), VX_SUCCESS);
-    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, (void*)&num_unique_kernels2, sizeof(num_unique_kernels2)), VX_SUCCESS);
-    ASSERT(num_modules2 > num_modules1);
-    ASSERT(num_unique_kernels2 > num_unique_kernels1);
-
-    VX_CALL(vxUnloadKernels(context, "test-testmodule"));
-
-    kernel = vxGetKernelByName(context, "org.khronos.test.testmodule");
-    ASSERT_NE_VX_STATUS(VX_SUCCESS, vxGetStatus((vx_reference)kernel));
-
-    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_modules2, sizeof(num_modules1)), VX_SUCCESS);
-    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, (void*)&num_unique_kernels2, sizeof(num_unique_kernels2)), VX_SUCCESS);
-    ASSERT(num_modules2 == num_modules1);
-    ASSERT(num_unique_kernels2 == num_unique_kernels1);
-}
-
-TEST(SmokeTest, test_vxSetReferenceName)
-{
-    vx_context context = context_->vx_context_;
-
-    vx_image image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8);
-    const char* image_name = "Image";
-    char* actual_name = NULL;
-
-    VX_CALL(vxSetReferenceName((vx_reference)image, image_name));
-    VX_CALL(vxQueryReference((vx_reference)image, VX_REFERENCE_NAME, &actual_name, sizeof(actual_name)));
-
-    ASSERT(0 == strcmp(image_name, actual_name));
-
-    VX_CALL(vxReleaseImage(&image));
-}
-
 TEST(SmokeTest, test_vxSetParameterByIndex)
 {
     vx_context context = context_->vx_context_;
@@ -576,12 +456,389 @@
     VX_CALL(vxReleaseGraph(&graph));
 }
 
+TEST(SmokeTest, test_vxSetParameterByReference)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0, dst_image = 0;
+    vx_graph graph = 0;
+    vx_kernel kernel = 0;
+    vx_node node = 0;
+    vx_uint32 num_params = 0;
+    vx_parameter parameter = 0;
+    vx_image p_image = 0;
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(dst_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByEnum(context, VX_KERNEL_BOX_3x3), VX_TYPE_KERNEL);
+    VX_CALL(vxQueryKernel(kernel, VX_KERNEL_PARAMETERS, &num_params, sizeof(num_params)));
+    ASSERT_EQ_INT(2, num_params);
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)src_image));
+
+    ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 0), VX_TYPE_PARAMETER);
+    VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &p_image, sizeof(p_image)));
+    ASSERT(p_image == src_image);
+    VX_CALL(vxReleaseImage(&p_image));
+    VX_CALL(vxReleaseParameter(&parameter));
+
+    ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 1), VX_TYPE_PARAMETER);
+    VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &p_image, sizeof(p_image)));
+    ASSERT(p_image != dst_image);
+    VX_CALL(vxSetParameterByReference(parameter, (vx_reference)dst_image));
+    VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &p_image, sizeof(p_image)));
+    ASSERT(p_image == dst_image);
+
+    VX_CALL(vxReleaseImage(&p_image));
+    VX_CALL(vxReleaseParameter(&parameter));
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseKernel(&kernel));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&dst_image));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node == 0);
+    ASSERT(kernel == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst_image == 0);
+    ASSERT(src_image == 0);
+}
+
+TEST(SmokeTest, test_vxGetParameterByIndex)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src_image = 0;
+    vx_graph graph = 0;
+    vx_kernel kernel = 0;
+    vx_node node = 0;
+    vx_uint32 num_params = 0;
+    vx_parameter parameter = 0;
+    vx_image p_image = 0;
+
+    ASSERT_VX_OBJECT(src_image = vxCreateImage(context, 128, 128, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByEnum(context, VX_KERNEL_BOX_3x3), VX_TYPE_KERNEL);
+    VX_CALL(vxQueryKernel(kernel, VX_KERNEL_PARAMETERS, &num_params, sizeof(num_params)));
+    ASSERT_EQ_INT(2, num_params);
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, kernel), VX_TYPE_NODE);
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)src_image));
+
+    ASSERT_VX_OBJECT(parameter = vxGetParameterByIndex(node, 0), VX_TYPE_PARAMETER);
+    VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_REF, &p_image, sizeof(p_image)));
+    ASSERT(p_image == src_image);
+    VX_CALL(vxReleaseImage(&p_image));
+    VX_CALL(vxReleaseParameter(&parameter));
+
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseKernel(&kernel));
+    VX_CALL(vxReleaseGraph(&graph));
+    VX_CALL(vxReleaseImage(&src_image));
+
+    ASSERT(node == 0);
+    ASSERT(kernel == 0);
+    ASSERT(graph == 0);
+    ASSERT(src_image == 0);
+}
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
+
+TESTCASE(SmokeTestBase, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST(SmokeTestBase, test_vxReleaseReferenceBase)
+{
+    vx_context context = context_->vx_context_;
+    vx_uint32 ref_count0 = 0;
+    vx_uint32 ref_count1 = 0;
+    vx_reference ref = 0;
+
+    {
+        /* test context reference */
+        ref = (vx_reference)context;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
+        VX_CALL(vxRetainReference(ref));
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
+        VX_CALL(vxReleaseReference(&ref));
+        ref = (vx_reference)context;
+        ref_count1 = 0;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
+    }
+
+    {
+        /* test graph reference */
+        vx_graph graph = 0;
+        EXPECT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+        ref = (vx_reference)graph;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
+        VX_CALL(vxRetainReference(ref));
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
+        VX_CALL(vxReleaseReference(&ref));
+        ref = (vx_reference)graph;
+        ref_count1 = 0;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
+
+        VX_CALL(vxReleaseGraph(&graph));
+    }
+
+    {
+        /* test graph reference */
+        vx_graph graph = 0;
+        EXPECT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+        ref = (vx_reference)graph;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
+        VX_CALL(vxRetainReference(ref));
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
+        VX_CALL(vxReleaseReference(&ref));
+        ref = (vx_reference)graph;
+        ref_count1 = 0;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
+
+        VX_CALL(vxReleaseGraph(&graph));
+    }
+
+    {
+        /* test kernel reference */
+        vx_kernel kernel = 0;
+        VX_CALL(vxLoadKernels(context, "test-testmodule"));
+        EXPECT_VX_OBJECT(kernel = vxGetKernelByName(context, "org.khronos.test.testmodule"), VX_TYPE_KERNEL);
+        ref = (vx_reference)kernel;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
+        VX_CALL(vxRetainReference(ref));
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
+        VX_CALL(vxReleaseReference(&ref));
+        ref = (vx_reference)kernel;
+        ref_count1 = 0;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
+
+        VX_CALL(vxReleaseKernel(&kernel));
+        VX_CALL(vxUnloadKernels(context, "test-testmodule"));
+    }
+
+    {
+        /* test parameter reference */
+        vx_kernel kernel = 0;
+        vx_parameter parameter = 0;
+        VX_CALL(vxLoadKernels(context, "test-testmodule"));
+        EXPECT_VX_OBJECT(kernel = vxGetKernelByName(context, "org.khronos.test.testmodule"), VX_TYPE_KERNEL);
+        EXPECT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, 0), VX_TYPE_PARAMETER);
+        ref = (vx_reference)parameter;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count0, sizeof(ref_count0)), VX_SUCCESS);
+        VX_CALL(vxRetainReference(ref));
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 1);
+        VX_CALL(vxReleaseReference(&ref));
+        ref = (vx_reference)parameter;
+        ref_count1 = 0;
+        ASSERT_EQ_VX_STATUS(vxQueryReference(ref, VX_REFERENCE_COUNT, (void*)&ref_count1, sizeof(ref_count1)), VX_SUCCESS);
+        ASSERT_EQ_INT(ref_count1 - ref_count0, 0);
+
+        VX_CALL(vxReleaseKernel(&kernel));
+        VX_CALL(vxReleaseParameter(&parameter));
+        VX_CALL(vxUnloadKernels(context, "test-testmodule"));
+    }
+
+}
+
+TEST(SmokeTestBase, test_vxLoadKernels)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+
+    VX_CALL(vxLoadKernels(context, "test-testmodule"));
+    EXPECT_VX_OBJECT(kernel = vxGetKernelByName(context, "org.khronos.test.testmodule"), VX_TYPE_KERNEL);
+    VX_CALL(vxReleaseKernel(&kernel));
+    VX_CALL(vxUnloadKernels(context, "test-testmodule"));
+}
+
+
+TEST(SmokeTestBase, test_vxUnloadKernels)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = NULL;
+    vx_int32 num_modules1;
+    vx_int32 num_modules2;
+    vx_int32 num_unique_kernels1;
+    vx_int32 num_unique_kernels2;
+
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_modules1, sizeof(num_modules1)), VX_SUCCESS);
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, (void*)&num_unique_kernels1, sizeof(num_unique_kernels1)), VX_SUCCESS);
+    ASSERT(num_modules1 >= 0u);
+    ASSERT(num_unique_kernels1 > 0u);
+
+    kernel = vxGetKernelByName(context, "org.khronos.test.testmodule");
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, vxGetStatus((vx_reference)kernel));
+
+    VX_CALL(vxLoadKernels(context, "test-testmodule"));
+    ASSERT_VX_OBJECT(kernel = vxGetKernelByName(context, "org.khronos.test.testmodule"), VX_TYPE_KERNEL);
+    VX_CALL(vxReleaseKernel(&kernel));
+
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_modules2, sizeof(num_modules1)), VX_SUCCESS);
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, (void*)&num_unique_kernels2, sizeof(num_unique_kernels2)), VX_SUCCESS);
+    ASSERT(num_modules2 > num_modules1);
+    ASSERT(num_unique_kernels2 > num_unique_kernels1);
+
+    VX_CALL(vxUnloadKernels(context, "test-testmodule"));
+
+    kernel = vxGetKernelByName(context, "org.khronos.test.testmodule");
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, vxGetStatus((vx_reference)kernel));
+
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_modules2, sizeof(num_modules1)), VX_SUCCESS);
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, (void*)&num_unique_kernels2, sizeof(num_unique_kernels2)), VX_SUCCESS);
+    ASSERT(num_modules2 == num_modules1);
+    ASSERT(num_unique_kernels2 == num_unique_kernels1);
+}
+
+TEST(SmokeTestBase, test_vxSetReferenceName)
+{
+    vx_context context = context_->vx_context_;
+
+    vx_graph graph = vxCreateGraph(context);
+    const char* graph_name = "Graph";
+    char* actual_name = NULL;
+
+    VX_CALL(vxSetReferenceName((vx_reference)graph, graph_name));
+    VX_CALL(vxQueryReference((vx_reference)graph, VX_REFERENCE_NAME, &actual_name, sizeof(actual_name)));
+
+    ASSERT(0 == strcmp(graph_name, actual_name));
+
+    VX_CALL(vxReleaseGraph(&graph));
+}
+
+TEST(SmokeTestBase, test_vxGetStatus)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = NULL;
+    vx_status status = VX_SUCCESS;
+
+    status = vxGetStatus((vx_reference)kernel);
+    ASSERT_EQ_INT(VX_ERROR_NO_RESOURCES, status);
+
+    kernel = vxGetKernelByName(context, "org.khronos.test.testmodule");
+    status = vxGetStatus((vx_reference)kernel);
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
+
+    kernel = vxGetKernelByName(context, "org.khronos.openvx.color_convert");
+    status = vxGetStatus((vx_reference)kernel);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+}
+
+TEST(SmokeTestBase, test_vxGetContext)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = NULL;
+    vx_context context_test = 0;
+
+    context_test = vxGetContext((vx_reference)kernel);
+    EXPECT_EQ_PTR(context_test, NULL);
+
+    kernel = vxGetKernelByName(context, "org.khronos.openvx.color_convert");
+    context_test = vxGetContext((vx_reference)kernel);
+    ASSERT_VX_OBJECT(context_test, VX_TYPE_CONTEXT);
+}
+
+TEST(SmokeTestBase, test_vxQueryReference)
+{
+    vx_context context = context_->vx_context_;
+    char* actual_name = NULL;
+    vx_status status = VX_SUCCESS;
+    vx_graph graph = 0;
+
+    status = vxQueryReference((vx_reference)graph, VX_REFERENCE_NAME, &actual_name, sizeof(actual_name));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    graph = vxCreateGraph(context);
+    status = vxQueryReference((vx_reference)graph, VX_REFERENCE_COUNT, &actual_name, 3);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    status = vxQueryReference((vx_reference)graph, VX_REFERENCE_TYPE, &actual_name, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    status = vxQueryReference((vx_reference)graph, VX_REFERENCE_NAME, NULL, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    status = vxQueryReference((vx_reference)graph, VX_TYPE_REFERENCE, &actual_name, sizeof(actual_name));
+    ASSERT_EQ_INT(VX_ERROR_NOT_SUPPORTED, status);
+
+    VX_CALL(vxReleaseGraph(&graph));
+
+}
+
+TEST(SmokeTestBase, test_vxRetainReferenceBase)
+{
+    vx_graph graph = 0;
+    vx_reference graph_ref = 0;
+    vx_uint32 graph_count = 0;
+    vx_context context = context_->vx_context_;
+    vx_uint32 num_refs1 = 0, num_refs2 = 0, num_refs3 = 0, num_refs4 = 0;
+
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs1, sizeof(num_refs1)), VX_SUCCESS);
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs2, sizeof(num_refs2)), VX_SUCCESS);
+    ASSERT_EQ_INT(num_refs2, num_refs1 + 1);
+
+    graph_ref = (vx_reference)graph;
+    ASSERT_EQ_VX_STATUS(vxQueryReference(graph_ref, VX_REFERENCE_COUNT, (void*)&graph_count, sizeof(graph_count)), VX_SUCCESS);
+    ASSERT_EQ_INT(graph_count, 1);
+
+    graph_ref = (vx_reference)graph;
+    VX_CALL(vxRetainReference(graph_ref));
+
+    graph_ref = (vx_reference)graph;
+    ASSERT_EQ_VX_STATUS(vxQueryReference(graph_ref, VX_REFERENCE_COUNT, (void*)&graph_count, sizeof(graph_count)), VX_SUCCESS);
+    ASSERT_EQ_INT(graph_count, 2);
+
+    graph_ref = (vx_reference)graph;
+    VX_CALL(vxReleaseReference(&graph_ref));
+
+    ASSERT_EQ_PTR(0, graph_ref);
+
+    graph_ref = (vx_reference)graph;
+    ASSERT_EQ_VX_STATUS(vxQueryReference(graph_ref, VX_REFERENCE_COUNT, (void*)&graph_count, sizeof(graph_count)), VX_SUCCESS);
+    ASSERT_EQ_INT(graph_count, 1);
+
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs3, sizeof(num_refs3)), VX_SUCCESS);
+    ASSERT_EQ_INT(num_refs3, num_refs1 + 1);
+
+    graph_ref = (vx_reference)graph;
+    VX_CALL(vxReleaseReference(&graph_ref));
+
+    ASSERT_EQ_PTR(0, graph_ref);
+
+    ASSERT_EQ_VX_STATUS(vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs4, sizeof(num_refs4)), VX_SUCCESS);
+    ASSERT_EQ_INT(num_refs4, num_refs1);
+}
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 TESTCASE_TESTS(SmokeTest,
         test_vxRegisterUserStruct,
         test_vxHint,
         test_vxReleaseReference,
         test_vxRetainReference,
+        test_vxSetParameterByIndex,
+        test_vxSetParameterByReference,
+        test_vxGetParameterByIndex
+        )
+
+#endif
+
+TESTCASE_TESTS(SmokeTestBase,
+        test_vxReleaseReferenceBase,
+        test_vxLoadKernels,
         test_vxUnloadKernels,
         test_vxSetReferenceName,
-        test_vxSetParameterByIndex
+        test_vxGetStatus,
+        test_vxGetContext,
+        test_vxQueryReference,
+        test_vxRetainReferenceBase
         )
+
diff --git a/test_conformance/test_sobel3x3.c b/test_conformance/test_sobel3x3.c
index 767406c..a3f94c5 100644
--- a/test_conformance/test_sobel3x3.c
+++ b/test_conformance/test_sobel3x3.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -335,3 +337,5 @@
 }
 
 TESTCASE_TESTS(Sobel3x3, testNodeCreation, testGraphProcessing, testImmediateProcessing)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_target.c b/test_conformance/test_target.c
index 6b08863..791161c 100644
--- a/test_conformance/test_target.c
+++ b/test_conformance/test_target.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -21,10 +21,6 @@
 #include <VX/vxu.h>
 #include <VX/vx_kernels.h>
 
-
-TESTCASE(Target, CT_VXContext, ct_setup_vx_context, 0)
-
-
 typedef struct
 {
     const char* testName;
@@ -47,6 +43,12 @@
 #define SET_IMM_MODE_TARGET_PARAMETERS \
     CT_GENERATE_PARAMETERS("target", ADD_SET_TARGET_PARAMETERS, ARG, NULL)
 
+
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
+TESTCASE(Target, CT_VXContext, ct_setup_vx_context, 0)
+
 TEST_WITH_ARG(Target, testvxSetNodeTarget, SetTarget_Arg, SET_NODE_TARGET_PARAMETERS)
 {
     vx_context context = context_->vx_context_;
@@ -103,8 +105,188 @@
     return;
 }
 
+#endif
+
+TESTCASE(TargetBase, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST(TargetBase, testvxCreateContext)
+{
+    vx_context context = vxCreateContext();
+    ASSERT_VX_OBJECT(context, VX_TYPE_CONTEXT);
+    vxReleaseContext(&context);
+}
+
+TEST(TargetBase, testvxQueryContext)
+{
+    vx_context context = context_->vx_context_;
+    vx_status status = VX_SUCCESS;
+    vx_uint32 num_refs1 = 0;
+    char * test = (char*)ct_alloc_mem(VX_MAX_IMPLEMENTATION_NAME);
+
+    vx_context context_test = NULL;
+    status = vxQueryContext(context_test, VX_CONTEXT_REFERENCES, (void*)&num_refs1, sizeof(num_refs1));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_VENDOR_ID, test, sizeof(vx_uint16));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_VENDOR_ID, test, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_VERSION, test, sizeof(vx_uint16));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_VERSION, test, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_refs1, sizeof(num_refs1));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_MODULES, (void*)&num_refs1, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs1, sizeof(num_refs1));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_REFERENCES, (void*)&num_refs1, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_IMPLEMENTATION, (void*)test, VX_MAX_IMPLEMENTATION_NAME);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_IMPLEMENTATION, (void*)&test, VX_MAX_IMPLEMENTATION_NAME + 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_EXTENSIONS_SIZE, test, sizeof(vx_size));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_EXTENSIONS_SIZE, test, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_EXTENSIONS, test, 2);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_EXTENSIONS, NULL, 2);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_CONVOLUTION_MAX_DIMENSION, test, sizeof(vx_size));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_CONVOLUTION_MAX_DIMENSION, test, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_NONLINEAR_MAX_DIMENSION, test, sizeof(vx_size));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_NONLINEAR_MAX_DIMENSION, test, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_OPTICAL_FLOW_MAX_WINDOW_DIMENSION, test, sizeof(vx_size));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_OPTICAL_FLOW_MAX_WINDOW_DIMENSION, test, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_IMMEDIATE_BORDER, test, sizeof(vx_border_t));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_IMMEDIATE_BORDER, NULL, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_IMMEDIATE_BORDER_POLICY, test, sizeof(vx_enum));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_IMMEDIATE_BORDER_POLICY, NULL, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, (void*)&num_refs1, sizeof(num_refs1));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNELS, NULL, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, test, sizeof(vx_size));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, NULL, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxQueryContext(context, VX_CONTEXT_UNIQUE_KERNEL_TABLE, NULL, 1);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+    status = vxQueryContext(context, VX_ERROR_INVALID_TYPE, (void*)&num_refs1, sizeof(num_refs1));
+    ASSERT_EQ_INT(VX_ERROR_NOT_SUPPORTED, status);
+
+    ct_free_mem(test);
+}
+
+TEST(TargetBase, testvxReleaseContext)
+{
+    vx_status status = VX_SUCCESS;
+    vx_context context_test = 0;
+
+    status = vxReleaseContext(&context_test);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    context_test = vxCreateContext();
+    ASSERT_VX_OBJECT(context_test, VX_TYPE_CONTEXT);
+    vx_border_t ptr;
+    ptr.mode = VX_BORDER_CONSTANT;
+    status = vxSetContextAttribute(context_test, VX_CONTEXT_IMMEDIATE_BORDER, &ptr, sizeof(vx_border_t));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxReleaseContext(&context_test);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+}
+
+TEST(TargetBase, testvxSetContextAttribute)
+{
+    vx_context context = context_->vx_context_;
+    vx_status status = VX_SUCCESS;
+
+    vx_context context_test = 0;
+    status = vxSetContextAttribute(context_test, VX_CONTEXT_IMMEDIATE_BORDER, NULL, 0);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    status = vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, NULL, sizeof(int));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_PARAMETERS, status);
+
+    status = vxSetContextAttribute(context, VX_CONTEXT_EXTENSIONS, NULL, sizeof(vx_border_t));
+    ASSERT_EQ_INT(VX_ERROR_NOT_SUPPORTED, status);
+
+    vx_border_t ptr = { 0 };
+    ptr.mode = VX_BORDER_POLICY_DEFAULT_TO_UNDEFINED;
+    status = vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &ptr, sizeof(vx_border_t));
+    ASSERT_EQ_INT(VX_ERROR_INVALID_VALUE, status);
+
+    ptr.mode = VX_BORDER_CONSTANT;
+    status = vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &ptr, sizeof(vx_border_t));
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+}
+
+TEST_WITH_ARG(TargetBase, testvxSetImmediateModeTargetBase, SetTarget_Arg, SET_IMM_MODE_TARGET_PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_status status = VX_SUCCESS;
+    char * string = "test";
+
+    vx_context context_test = 0;
+    status = vxSetImmediateModeTarget(context_test, arg_->target_enum, arg_->target_string);
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+
+    status = vxSetImmediateModeTarget(context, arg_->target_enum, arg_->target_string);
+    ASSERT_EQ_INT(VX_SUCCESS, status);
+    status = vxSetImmediateModeTarget(context, VX_TARGET_STRING, string);
+    ASSERT_EQ_INT(VX_ERROR_NOT_SUPPORTED, status);
+}
+
+TEST(TargetBase, testvxSetNodeTargetBase)
+{
+    vx_node node = 0;
+    vx_status status = VX_SUCCESS;
+
+    status = vxSetNodeTarget(node, VX_TARGET_ANY, "any");
+    ASSERT_EQ_INT(VX_ERROR_INVALID_REFERENCE, status);
+}
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
 
 TESTCASE_TESTS(Target,
         testvxSetNodeTarget,
         testvxSetImmediateModeTarget
         )
+
+#endif
+
+TESTCASE_TESTS(TargetBase,
+        testvxCreateContext,
+        testvxQueryContext,
+        testvxReleaseContext,
+        testvxSetContextAttribute,
+        testvxSetImmediateModeTargetBase,
+        testvxSetNodeTargetBase
+        )
diff --git a/test_conformance/test_tensor_networks.c b/test_conformance/test_tensor_networks.c
index 775f285..bbdaf00 100644
--- a/test_conformance/test_tensor_networks.c
+++ b/test_conformance/test_tensor_networks.c
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
 #ifdef OPENVX_USE_NN_16
 
 #include "test_tensor_util.h"
@@ -220,7 +221,7 @@
     graph = vxCreateGraph(context);
     status |= vxGetStatus((vx_reference)graph);
     if(status == VX_SUCCESS)
-    {        
+    {
         /*
          * List of nodes to define a graph partition to create (use for debug purposes)
          * Note: 1) If the list is empty, the entire graph will be created
@@ -319,13 +320,13 @@
     if(graph)
     {
         // Release OpenVX graph
-        status = vxReleaseGraph(&graph);        
+        status = vxReleaseGraph(&graph);
         if(status != VX_SUCCESS)
         {
             WriteLog("ERROR: failed to release graph (vx_status=%s)\n", getVxStatusDesc(status));
         }
     }
-    
+
     VX_CALL(status);
     if (correct_detections < min_correct_alexnet)
     {
@@ -362,3 +363,4 @@
 //    FCN
 )
 #endif
+#endif//OPENVX_CONFORMANCE_NEURAL_NETWORKS
\ No newline at end of file
diff --git a/test_conformance/test_tensor_nn.c b/test_conformance/test_tensor_nn.c
index fd0fb6a..29e4e3c 100644
--- a/test_conformance/test_tensor_nn.c
+++ b/test_conformance/test_tensor_nn.c
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
 #ifdef OPENVX_USE_NN
 
 #include "test_tensor_util.h"
@@ -138,7 +139,7 @@
 
             sum = ownLoadValueAsRawInt(fmt, (char *)bias_ptr + bias_byte_offset);
         }
-        
+
         const size_t xx = x * stride_x;
         const size_t yy = y * stride_y;
 
@@ -282,9 +283,9 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     const size_t inout_dim_num = 3 + arg_->batching_dim;
@@ -391,11 +392,11 @@
         const size_t weight_count = weight_bytes / sizeof_data_type;
         const size_t bias_count = bias_bytes / sizeof_data_type;
 
-        void * const in = malloc(in_bytes);
-        void * const weight = malloc(weight_bytes);
-        void * const bias = bias_dim_num ? malloc(bias_bytes) : NULL;
-        void * const out = malloc(out_bytes);
-        void * const refs = malloc(out_bytes);
+        void * const in = ct_alloc_mem(in_bytes);
+        void * const weight = ct_alloc_mem(weight_bytes);
+        void * const bias = bias_dim_num ? ct_alloc_mem(bias_bytes) : NULL;
+        void * const out = ct_alloc_mem(out_bytes);
+        void * const refs = ct_alloc_mem(out_bytes);
         ASSERT(in && weight && (!bias_count || bias) && out && refs);
 
         {
@@ -489,11 +490,11 @@
         EXPECT_EQ_PTR(NULL, bias_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(in);
-        free(weight);
-        free(bias);
-        free(out);
-        free(refs);
+        ct_free_mem(in);
+        ct_free_mem(weight);
+        ct_free_mem(bias);
+        ct_free_mem(out);
+        ct_free_mem(refs);
     }
 }
 
@@ -696,9 +697,9 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     const size_t in_dim_num = arg_->core_dim + arg_->batch_dim;
@@ -719,7 +720,7 @@
         vx_size bias_dims[1];
         vx_size out_dims[4];
         {
-            for (size_t i = 0; i < in_dim_num; ++i) 
+            for (size_t i = 0; i < in_dim_num; ++i)
             {
                 in_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
             }
@@ -744,7 +745,7 @@
                 weight_dims[0] = in_dims[0];
                 weight_dims[1] = in_dims[1];
                 weight_dims[2] = in_dims[2];
-            } 
+            }
 
             if (bias_dim_num) bias_dims[0] = out_dims[0];
         }
@@ -780,11 +781,11 @@
         const size_t weight_count = bias_bytes / sizeof_data_type;
         const size_t bias_count = bias_bytes / sizeof_data_type;
 
-        void * const in = malloc(in_bytes);
-        void * const weight = malloc(weight_bytes);
-        void * const bias = bias_dim_num ? malloc(bias_bytes) : NULL;
-        void * const out = malloc(out_bytes);
-        void * const refs = malloc(out_bytes);
+        void * const in = ct_alloc_mem(in_bytes);
+        void * const weight = ct_alloc_mem(weight_bytes);
+        void * const bias = bias_dim_num ? ct_alloc_mem(bias_bytes) : NULL;
+        void * const out = ct_alloc_mem(out_bytes);
+        void * const refs = ct_alloc_mem(out_bytes);
         ASSERT(in && weight && (!bias_dim_num || bias) && out && refs);
 
         vx_tensor in_tensor = vxCreateTensor(context_->vx_context_, in_dim_num, in_dims, data_type, fixed_point_position);
@@ -892,11 +893,11 @@
         EXPECT_EQ_PTR(NULL, bias_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(in);
-        free(weight);
-        free(bias);
-        free(out);
-        free(refs);
+        ct_free_mem(in);
+        ct_free_mem(weight);
+        ct_free_mem(bias);
+        ct_free_mem(out);
+        ct_free_mem(refs);
     }
 }
 
@@ -1056,9 +1057,9 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     const size_t dim_num = 3 + arg_->batching_dim;
@@ -1111,9 +1112,9 @@
 
         const size_t in_count = in_bytes / sizeof_data_type;
 
-        void * const in = malloc(in_bytes);
-        void * const out = malloc(out_bytes);
-        void * const refs = malloc(out_bytes);
+        void * const in = ct_alloc_mem(in_bytes);
+        void * const out = ct_alloc_mem(out_bytes);
+        void * const refs = ct_alloc_mem(out_bytes);
         ASSERT(in && out && refs);
 
         vx_tensor in_tensor = vxCreateTensor(context_->vx_context_, dim_num, in_dims, data_type, fixed_point_position);
@@ -1124,7 +1125,7 @@
         {
             // No real need to fo ownFillSmallRandData here because of the
             // guranteed 32bit accum and our data counts being small.
-            ownFillRandData(arg_->fmt, &rng, in_count, in); 
+            ownFillRandData(arg_->fmt, &rng, in_count, in);
 
             const vx_size view_start[4] = { 0 };
             VX_CALL(vxCopyTensorPatch(in_tensor, dim_num, view_start, in_dims, in_strides, in, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
@@ -1195,9 +1196,9 @@
         EXPECT_EQ_PTR(NULL, in_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(in);
-        free(out);
-        free(refs);
+        ct_free_mem(in);
+        ct_free_mem(out);
+        ct_free_mem(refs);
     }
 }
 
@@ -1215,7 +1216,7 @@
 {
 //TODO: @Tomer, should we allow extra batch dims beyond 4? conv and poll have upto 3 of them! if not we can just discard this define and its usage
 #define SOFTMAX_ALLOW_EXTRA_DIMS
-    
+
 #ifdef SOFTMAX_ALLOW_EXTRA_DIMS
     assert(input.dim_num >= 1 && input.dim_num <= 4);
 #else
@@ -1234,7 +1235,7 @@
 
     size_t key_sz = 0;
     size_t key_in_stride = 0;
-    
+
 #ifdef SOFTMAX_ALLOW_EXTRA_DIMS
     size_t batch_sz[5] = { 1, 1, 1, 1, 1 };
     size_t batch_in_strides[5] = { 0 };
@@ -1392,7 +1393,7 @@
 
             max_val = MAX(max_val, in_val);
         }
-        
+
         // Note: It may be benificial to cache the exponents
         for (size_t i = 0; i < key_sz; ++i)
         {
@@ -1446,7 +1447,7 @@
     {   // TODO: ownTestGetMaxDims() ?
         vx_size max_dims = 0;
         VX_CALL(vxQueryContext(context_->vx_context_, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
-        ASSERT(max_dims >= arg_->dim_num); 
+        ASSERT(max_dims >= arg_->dim_num);
     }
 
     uint64_t rng;
@@ -1456,9 +1457,9 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
@@ -1488,9 +1489,9 @@
         const size_t bytes = dims[arg_->dim_num-1] * strides[arg_->dim_num-1];
         const size_t count = bytes / sizeof_data_type;
 
-        void * const in = malloc(bytes);
-        void * const out = malloc(bytes);
-        void * const refs = malloc(bytes);
+        void * const in = ct_alloc_mem(bytes);
+        void * const out = ct_alloc_mem(bytes);
+        void * const refs = ct_alloc_mem(bytes);
         ASSERT(in && out && refs);
 
         vx_tensor in_tensor = vxCreateTensor(context_->vx_context_, arg_->dim_num, dims, data_type, fixed_point_position);
@@ -1501,7 +1502,7 @@
         {
             // No real need to fo ownFillSmallRandData here because of the
             // guranteed 32bit accum and our data counts being small.
-            ownFillRandData(arg_->fmt, &rng, count, in); 
+            ownFillRandData(arg_->fmt, &rng, count, in);
 
             const vx_size view_start[4] = { 0 };
             VX_CALL(vxCopyTensorPatch(in_tensor, arg_->dim_num, view_start, dims, strides, in, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
@@ -1558,9 +1559,9 @@
         EXPECT_EQ_PTR(NULL, in_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(in);
-        free(out);
-        free(refs);
+        ct_free_mem(in);
+        ct_free_mem(out);
+        ct_free_mem(refs);
     }
 }
 
@@ -1609,7 +1610,7 @@
             func == VX_NN_ACTIVATION_SQUARE ||
             func == VX_NN_ACTIVATION_SQRT ||
             func == VX_NN_ACTIVATION_LINEAR);
-    
+
     assert (input.dim_num == output.dim_num);
     assert (input.dim_num > 0 && input.dim_num <= 4);
 
@@ -1746,7 +1747,7 @@
     {   // TODO: ownTestGetMaxDims() ?
         vx_size max_dims = 0;
         VX_CALL(vxQueryContext(context_->vx_context_, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
-        ASSERT(max_dims >= arg_->dim_num); 
+        ASSERT(max_dims >= arg_->dim_num);
     }
 
     uint64_t rng;
@@ -1756,9 +1757,9 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
@@ -1788,9 +1789,9 @@
         const size_t bytes = dims[arg_->dim_num-1] * strides[arg_->dim_num-1];
         const size_t count = bytes / sizeof_data_type;
 
-        void * const in = malloc(bytes);
-        void * const out = malloc(bytes);
-        void * const refs = malloc(bytes);
+        void * const in = ct_alloc_mem(bytes);
+        void * const out = ct_alloc_mem(bytes);
+        void * const refs = ct_alloc_mem(bytes);
         ASSERT(in && out && refs);
 
         vx_tensor in_tensor = vxCreateTensor(context_->vx_context_, arg_->dim_num, dims, data_type, fixed_point_position);
@@ -1799,7 +1800,7 @@
         ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
 
         {
-            ownFillRandData(arg_->fmt, &rng, count, in); 
+            ownFillRandData(arg_->fmt, &rng, count, in);
 
             const vx_size view_start[4] = { 0 };
             VX_CALL(vxCopyTensorPatch(in_tensor, arg_->dim_num, view_start, dims, strides, in, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
@@ -1857,9 +1858,9 @@
         EXPECT_EQ_PTR(NULL, in_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(in);
-        free(out);
-        free(refs);
+        ct_free_mem(in);
+        ct_free_mem(out);
+        ct_free_mem(refs);
     }
 }
 
@@ -2011,23 +2012,23 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     const size_t data_dim_num = arg_->with_batching ? 4 : 3;
     const size_t rois_dim_num = arg_->with_batching ? 3 : 2;
     const size_t out_dim_num = arg_->with_batching ? 5 : 4;
 
-    size_t * const data_dims = malloc(sizeof(*data_dims) * data_dim_num);
-    size_t * const rois_dims = malloc(sizeof(*rois_dims) * rois_dim_num);
-    size_t * const out_dims = malloc(sizeof(*out_dims) * out_dim_num);
+    size_t * const data_dims = ct_alloc_mem(sizeof(*data_dims) * data_dim_num);
+    size_t * const rois_dims = ct_alloc_mem(sizeof(*rois_dims) * rois_dim_num);
+    size_t * const out_dims = ct_alloc_mem(sizeof(*out_dims) * out_dim_num);
     ASSERT(data_dims && rois_dims && out_dims);
-    
-    size_t * const data_strides = malloc(sizeof(*data_strides) * data_dim_num);
-    size_t * const rois_strides = malloc(sizeof(*rois_strides) * rois_dim_num);
-    size_t * const out_strides = malloc(sizeof(*out_strides) * out_dim_num);
+
+    size_t * const data_strides = ct_alloc_mem(sizeof(*data_strides) * data_dim_num);
+    size_t * const rois_strides = ct_alloc_mem(sizeof(*rois_strides) * rois_dim_num);
+    size_t * const out_strides = ct_alloc_mem(sizeof(*out_strides) * out_dim_num);
     ASSERT(data_strides && rois_strides && out_strides);
 
     for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
@@ -2088,10 +2089,10 @@
 
         const size_t data_count = data_bytes / sizeof_data_type;
 
-        void * const data = malloc(data_bytes);
-        void * const rois = malloc(rois_bytes);
-        void * const out = malloc(out_bytes);
-        void * const refs = malloc(out_bytes);
+        void * const data = ct_alloc_mem(data_bytes);
+        void * const rois = ct_alloc_mem(rois_bytes);
+        void * const out = ct_alloc_mem(out_bytes);
+        void * const refs = ct_alloc_mem(out_bytes);
         ASSERT(data && rois && out && refs);
 
         {
@@ -2188,19 +2189,19 @@
         EXPECT_EQ_PTR(NULL, rois_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(data);
-        free(rois);
-        free(out);
-        free(refs);
+        ct_free_mem(data);
+        ct_free_mem(rois);
+        ct_free_mem(out);
+        ct_free_mem(refs);
     }
 
-    free(data_dims);
-    free(rois_dims);
-    free(out_dims);
+    ct_free_mem(data_dims);
+    ct_free_mem(rois_dims);
+    ct_free_mem(out_dims);
 
-    free(data_strides);
-    free(rois_strides);
-    free(out_strides);
+    ct_free_mem(data_strides);
+    ct_free_mem(rois_strides);
+    ct_free_mem(out_strides);
 }
 
 
@@ -2333,7 +2334,7 @@
 
             sum = ownLoadValueAsRawInt(fmt, (char *)bias_ptr + bias_byte_offset);
         }
-        
+
         for (size_t ifm = 0; ifm < input_c; ++ifm)
         {
             for (size_t w_y = 0; w_y < weight_h; ++w_y)
@@ -2461,9 +2462,9 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     const size_t inout_dim_num = 3 + arg_->batching_dim;
@@ -2568,11 +2569,11 @@
         const size_t weight_count = weight_bytes / sizeof_data_type;
         const size_t bias_count = bias_bytes / sizeof_data_type;
 
-        void * const in = malloc(in_bytes);
-        void * const weight = malloc(weight_bytes);
-        void * const bias = bias_dim_num ? malloc(bias_bytes) : NULL;
-        void * const out = malloc(out_bytes);
-        void * const refs = malloc(out_bytes);
+        void * const in = ct_alloc_mem(in_bytes);
+        void * const weight = ct_alloc_mem(weight_bytes);
+        void * const bias = bias_dim_num ? ct_alloc_mem(bias_bytes) : NULL;
+        void * const out = ct_alloc_mem(out_bytes);
+        void * const refs = ct_alloc_mem(out_bytes);
         ASSERT(in && weight && (!bias_count || bias) && out && refs);
 
         {
@@ -2667,11 +2668,11 @@
         EXPECT_EQ_PTR(NULL, bias_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(in);
-        free(weight);
-        free(bias);
-        free(out);
-        free(refs);
+        ct_free_mem(in);
+        ct_free_mem(weight);
+        ct_free_mem(bias);
+        ct_free_mem(out);
+        ct_free_mem(refs);
     }
 }
 
@@ -2687,3 +2688,4 @@
     testDeconvolutionLayer
 )
 #endif
+#endif//OPENVX_CONFORMANCE_NEURAL_NETWORKS
diff --git a/test_conformance/test_tensor_op.c b/test_conformance/test_tensor_op.c
index 832f31d..62f9e79 100644
--- a/test_conformance/test_tensor_op.c
+++ b/test_conformance/test_tensor_op.c
@@ -14,6 +14,10 @@
  * limitations under the License.
  */
 
+#ifdef OPENVX_USE_ENHANCED_VISION
+
+#include <VX/vx.h>
+#include <VX/vxu.h>
 #include "test_tensor_util.h"
 
 
@@ -66,7 +70,7 @@
                 const vx_int16 in0 = *(vx_int16*)in0_b_ptr;
                 const vx_int16 in1 = *(vx_int16*)in1_b_ptr;
                 const vx_int16 out = *(vx_int16*)out_b_ptr;
-                int16_t ref;
+                int16_t ref = 0;
 
                 switch (op)
                 {
@@ -85,7 +89,7 @@
                 case TT_MUL:
                     {
                         double tmp = in0 * in1 * q78_scale;
-                        tmp = to_ne ? nearbyint(tmp) : trunc(tmp); 
+                        tmp = to_ne ? nearbyint(tmp) : trunc(tmp);
                         ref = wrap ? trunc_to_int16(tmp) : CLAMP(tmp, INT16_MIN, INT16_MAX);
                     }
                     break;
@@ -118,7 +122,7 @@
                 const vx_uint8 in0 = *(vx_uint8*)in0_b_ptr;
                 const vx_uint8 in1 = *(vx_uint8*)in1_b_ptr;
                 const vx_uint8 out = *(vx_uint8*)out_b_ptr;
-                uint8_t ref;
+                uint8_t ref = 0;
 
                 switch (op)
                 {
@@ -137,7 +141,7 @@
                 case TT_MUL:
                     {
                         double tmp = in0 * in1 * scale;
-                        tmp = to_ne ? nearbyint(tmp) : trunc(tmp); 
+                        tmp = to_ne ? nearbyint(tmp) : trunc(tmp);
                         ref = wrap ? tmp : CLAMP(tmp, 0, UINT8_MAX);
                     }
                     break;
@@ -154,7 +158,7 @@
                 const vx_int8 in0 = *(vx_int8*)in0_b_ptr;
                 const vx_int8 in1 = *(vx_int8*)in1_b_ptr;
                 const vx_int8 out = *(vx_int8*)out_b_ptr;
-                int8_t ref;
+                int8_t ref = 0;
 
                 switch (op)
                 {
@@ -173,7 +177,7 @@
                 case TT_MUL:
                     {
                         double tmp = in0 * in1 * scale;
-                        tmp = to_ne ? nearbyint(tmp) : trunc(tmp); 
+                        tmp = to_ne ? nearbyint(tmp) : trunc(tmp);
                         ref = wrap ? trunc_to_int8(tmp) : CLAMP(tmp, INT8_MIN, INT8_MAX);
                     }
                     break;
@@ -228,7 +232,7 @@
     TT_ELEMENTWISE_OP0(U8)      \
     TT_ELEMENTWISE_OP0(S8)
 
-TEST_WITH_ARG(TensorOp, testTensorElementwiseOp, test_tensor_elementwise_op_arg,
+TEST_WITH_ARG(TensorOp, testvxTensorElementwiseOp, test_tensor_elementwise_op_arg,
         TT_ELEMENTWISE_OP_ALL()
 )
 {
@@ -245,7 +249,7 @@
     assert(op == TT_ADD || op == TT_SUB || op == TT_MUL);
     assert(overflow_policy == VX_CONVERT_POLICY_WRAP || overflow_policy == VX_CONVERT_POLICY_SATURATE);
     assert(rounding_policy == VX_ROUND_POLICY_TO_ZERO || rounding_policy == VX_ROUND_POLICY_TO_NEAREST_EVEN);
-    
+
     // Only MUL supports rounding_policy and scale, we chose not to allow anything but default values for other ops
     assert(TT_MUL || (rounding_policy == VX_ROUND_POLICY_TO_ZERO && scale == 1.f));
 
@@ -263,19 +267,19 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
-    size_t * const in0_dims = malloc(sizeof(*in0_dims) * max_dims);
-    size_t * const in1_dims = malloc(sizeof(*in1_dims) * max_dims);
-    size_t * const out_dims = malloc(sizeof(*out_dims) * max_dims);
+    size_t * const in0_dims = ct_alloc_mem(sizeof(*in0_dims) * max_dims);
+    size_t * const in1_dims = ct_alloc_mem(sizeof(*in1_dims) * max_dims);
+    size_t * const out_dims = ct_alloc_mem(sizeof(*out_dims) * max_dims);
     ASSERT(in0_dims && in1_dims && out_dims);
 
-    size_t * const in0_strides = malloc(sizeof(*in0_strides) * max_dims);
-    size_t * const in1_strides = malloc(sizeof(*in1_strides) * max_dims);
-    size_t * const out_strides = malloc(sizeof(*out_strides) * max_dims);
+    size_t * const in0_strides = ct_alloc_mem(sizeof(*in0_strides) * max_dims);
+    size_t * const in1_strides = ct_alloc_mem(sizeof(*in1_strides) * max_dims);
+    size_t * const out_strides = ct_alloc_mem(sizeof(*out_strides) * max_dims);
     ASSERT(in0_strides && in1_strides && out_strides);
 
     // The test strategy is a simple one: For each of the 1..max_dims supported
@@ -354,9 +358,9 @@
 
         // Second step is to allocate the input and output data locations and populate the inputs.
 
-        void * const in0_data = malloc(in0_bytes);
-        void * const in1_data = malloc(in1_bytes);
-        void * const out_data = malloc(out_bytes);
+        void * const in0_data = ct_alloc_mem(in0_bytes);
+        void * const in1_data = ct_alloc_mem(in1_bytes);
+        void * const out_data = ct_alloc_mem(out_bytes);
         ASSERT(in0_data && in1_data && out_data);
 
         {
@@ -435,20 +439,227 @@
         EXPECT_EQ_PTR(NULL, in1_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(in0_data);
-        free(in1_data);
-        free(out_data);
+        ct_free_mem(in0_data);
+        ct_free_mem(in1_data);
+        ct_free_mem(out_data);
     }
 
-    free(in0_dims);
-    free(in1_dims);
-    free(out_dims);
+    ct_free_mem(in0_dims);
+    ct_free_mem(in1_dims);
+    ct_free_mem(out_dims);
 
-    free(in0_strides);
-    free(in1_strides);
-    free(out_strides);
+    ct_free_mem(in0_strides);
+    ct_free_mem(in1_strides);
+    ct_free_mem(out_strides);
 }
 
+TEST_WITH_ARG(TensorOp, testvxuTensorElementwiseOp, test_tensor_elementwise_op_arg,
+        TT_ELEMENTWISE_OP_ALL()
+)
+{
+    const vx_context context = context_->vx_context_;
+
+    const enum TestTensorDF fmt = arg_->fmt;
+    const enum TestTensorOp op = arg_->op;
+
+    const enum vx_convert_policy_e overflow_policy = arg_->convert_policy;
+    const enum vx_round_policy_e rounding_policy = arg_->rounding_policy;
+    const vx_float32 scale = arg_->scale;
+
+    assert(fmt == TT_Q78 || fmt == TT_U8 || fmt == TT_S8);
+    assert(op == TT_ADD || op == TT_SUB || op == TT_MUL);
+    assert(overflow_policy == VX_CONVERT_POLICY_WRAP || overflow_policy == VX_CONVERT_POLICY_SATURATE);
+    assert(rounding_policy == VX_ROUND_POLICY_TO_ZERO || rounding_policy == VX_ROUND_POLICY_TO_NEAREST_EVEN);
+
+    // Only MUL supports rounding_policy and scale, we chose not to allow anything but default values for other ops
+    assert(TT_MUL || (rounding_policy == VX_ROUND_POLICY_TO_ZERO && scale == 1.f));
+
+    vx_size max_dims = 0;
+    {   // TODO: ownTestGetMaxDims() ?
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if(!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    size_t * const in0_dims = ct_alloc_mem(sizeof(*in0_dims) * max_dims);
+    size_t * const in1_dims = ct_alloc_mem(sizeof(*in1_dims) * max_dims);
+    size_t * const out_dims = ct_alloc_mem(sizeof(*out_dims) * max_dims);
+    ASSERT(in0_dims && in1_dims && out_dims);
+
+    size_t * const in0_strides = ct_alloc_mem(sizeof(*in0_strides) * max_dims);
+    size_t * const in1_strides = ct_alloc_mem(sizeof(*in1_strides) * max_dims);
+    size_t * const out_strides = ct_alloc_mem(sizeof(*out_strides) * max_dims);
+    ASSERT(in0_strides && in1_strides && out_strides);
+
+    // The test strategy is a simple one: For each of the 1..max_dims supported
+    // we test a TEST_TENSOR_NUM_ITERATIONS of random dim and broadcast
+    // configurations. This approach may have issues if the implementation
+    // supports a lot of dimensions since their random size being up to
+    // TEST_TENSOR_MAX_DIM_SZ, could result in a huge memory requirement.
+    // However from previous experience we expect this to typically be 4-6 dims.
+    // The other issue is that we do not test huge dimensions.
+    // Further limitations include lack of virtual/ view inputs and outputs as -
+    // well as lack of modified stride testing etc.
+
+    // Note that iter is the inner loop, so that if two implementations support
+    // D1 and D2 dims resp. the same (pseudo-random) values would be used when
+    // testing the common min(D1, D2) dimensions.
+    for (vx_size dims = 1; dims <= max_dims; ++dims)
+    for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
+    {
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("dims #: %zu,\titer #: %d\n", dims, iter);
+            fflush(stdout);
+        }
+
+        // First step is to get some random dim sizes, calc the strides and create the tensors.
+
+        for (vx_size i = 0; i < dims; ++i)
+        {
+            const size_t new_dim = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+
+            const int mask0 = !!CT_RNG_NEXT_INT(rng, 0, TEST_TENSOR_INVERSE_MASK_PROBABILITY);
+            const int mask1 = !!CT_RNG_NEXT_INT(rng, 0, TEST_TENSOR_INVERSE_MASK_PROBABILITY);
+
+            // Note: Broadcasting is described as for each dim, either in0 and in1 have the same
+            // size or "1" for a broadcasted value. And the output is strictly determined by them
+            // so that the implementation is required to support
+            // { in0, in1, out } = { 1, 5, 5 } but not { in0, in1, out } = { 1, 1, 5 }
+            // even though the KHR sample implementation currently supports both.
+            in0_dims[i] = mask0 ? new_dim : 1;
+            in1_dims[i] = mask1 ? new_dim : 1;
+            out_dims[i] = mask0 || mask1 ? new_dim : 1;
+
+            in0_strides[i] = i ? in0_strides[i - 1] * in0_dims[i - 1] : sizeof_data_type;
+            in1_strides[i] = i ? in1_strides[i - 1] * in1_dims[i - 1] : sizeof_data_type;
+            out_strides[i] = i ? out_strides[i - 1] * out_dims[i - 1] : sizeof_data_type;
+        }
+
+        vx_tensor in0_tensor = vxCreateTensor(context, dims, in0_dims, data_type, fixed_point_position);
+        vx_tensor in1_tensor = vxCreateTensor(context, dims, in1_dims, data_type, fixed_point_position);
+        vx_tensor out_tensor = vxCreateTensor(context, dims, out_dims, data_type, fixed_point_position);
+        ASSERT_VX_OBJECT(in0_tensor, VX_TYPE_TENSOR);
+        ASSERT_VX_OBJECT(in1_tensor, VX_TYPE_TENSOR);
+        ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+        const size_t in0_bytes = in0_dims[dims - 1] * in0_strides[dims - 1];
+        const size_t in1_bytes = in1_dims[dims - 1] * in1_strides[dims - 1];
+        const size_t out_bytes = out_dims[dims - 1] * out_strides[dims - 1];
+
+        const size_t in0_count = in0_bytes / sizeof_data_type;
+        const size_t in1_count = in1_bytes / sizeof_data_type;
+        const size_t out_count = out_bytes / sizeof_data_type;
+
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("\tconfig: {\n");
+            printf("\t          dim_num: %zu,\n", dims);
+            printf("\t          in0 : { dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", in0_dims[i]); } printf(" }, count: %zu, bytes: %zu },\n", in0_count, in0_bytes);
+            printf("\t          in1 : { dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", in1_dims[i]); } printf(" }, count: %zu, bytes: %zu },\n", in1_count, in1_bytes);
+            printf("\t          out : { dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", out_dims[i]); } printf(" }, count: %zu, bytes: %zu },\n", out_count, out_bytes);
+            printf("\t        }\n");
+        }
+
+        //TODO: This is pretty wasteful as it's repeating a lot of work per iteration:
+        //      Both in the repeated malloc + free and inefficient data population
+        //      which discards much of the random data, only using a part of it.
+
+        // Second step is to allocate the input and output data locations and populate the inputs.
+
+        void * const in0_data = ct_alloc_mem(in0_bytes);
+        void * const in1_data = ct_alloc_mem(in1_bytes);
+        void * const out_data = ct_alloc_mem(out_bytes);
+        ASSERT(in0_data && in1_data && out_data);
+
+        {
+            ownFillRandData(fmt, &rng, in0_count, in0_data);
+            ownFillRandData(fmt, &rng, in1_count, in1_data);
+
+            vx_size view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(in0_tensor, dims, view_start, in0_dims, in0_strides, in0_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+            VX_CALL(vxCopyTensorPatch(in1_tensor, dims, view_start, in1_dims, in1_strides, in1_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+
+        // Third step is creating, running and disposing of the graph.
+        {
+            switch (op)
+            {
+            case TT_ADD:
+                VX_CALL(vxuTensorAdd(context, in0_tensor, in1_tensor, overflow_policy, out_tensor));
+                break;
+            case TT_SUB:
+                VX_CALL(vxuTensorSubtract(context, in0_tensor, in1_tensor, overflow_policy, out_tensor));
+                break;
+            case TT_MUL:
+            {
+                vx_scalar scalar = vxCreateScalar(context, VX_TYPE_FLOAT32, &scale);
+                ASSERT_VX_OBJECT(scalar, VX_TYPE_SCALAR);
+
+                VX_CALL(vxuTensorMultiply(context, in0_tensor, in1_tensor, scalar, overflow_policy, rounding_policy, out_tensor));
+
+                VX_CALL(vxReleaseScalar(&scalar));
+                EXPECT_EQ_PTR(NULL, scalar);
+                break;
+            }
+            default:
+                ASSERT(0);
+                // Not implemented;
+            }
+        }
+
+        // Verify the results
+        {
+            const size_t view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(out_tensor, dims, view_start, out_dims, out_strides, out_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+            ownCheckAddSubMulResult(
+                    in0_data, in0_dims, in0_strides,
+                    in1_data, in1_dims, in1_strides,
+                    fmt,
+                    op,
+                    dims,
+                    out_count,
+                    overflow_policy == VX_CONVERT_POLICY_WRAP,
+                    rounding_policy == VX_ROUND_POLICY_TO_NEAREST_EVEN,
+                    scale,
+                    out_data, out_dims, out_strides);
+        }
+
+        VX_CALL(vxReleaseTensor(&in0_tensor));
+        VX_CALL(vxReleaseTensor(&in1_tensor));
+        VX_CALL(vxReleaseTensor(&out_tensor));
+        EXPECT_EQ_PTR(NULL, in0_tensor);
+        EXPECT_EQ_PTR(NULL, in1_tensor);
+        EXPECT_EQ_PTR(NULL, out_tensor);
+
+        ct_free_mem(in0_data);
+        ct_free_mem(in1_data);
+        ct_free_mem(out_data);
+    }
+
+    ct_free_mem(in0_dims);
+    ct_free_mem(in1_dims);
+    ct_free_mem(out_dims);
+
+    ct_free_mem(in0_strides);
+    ct_free_mem(in1_strides);
+    ct_free_mem(out_strides);
+}
+
+
 /****************************************************************************
  *                                                                          *
  *                              LUT Test                                    *
@@ -511,7 +722,7 @@
     enum TestTensorDF fmt;
 } test_tensor_lut_op_arg;
 
-TEST_WITH_ARG(TensorOp, testTensorTableLookupOp, test_tensor_lut_op_arg,
+TEST_WITH_ARG(TensorOp, testvxTensorTableLookup, test_tensor_lut_op_arg,
         ARG("Q78_TABLELOOKUP", TT_Q78),
         ARG("U8_TABLELOOKUP", TT_U8),
 //        ARG("S8_TABLELOOKUP", TT_S8),
@@ -536,19 +747,19 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
-    vx_size lut_max_count;
-    vx_enum lut_data_type;
+    vx_size lut_max_count = 0;
+    vx_enum lut_data_type = 0;
     ownUnpackFormatForLUT(fmt, &lut_max_count, &lut_data_type);
 
-    size_t * const tensor_dims = malloc(sizeof(*tensor_dims) * max_dims);
-    size_t * const tensor_strides = malloc(sizeof(*tensor_strides) * max_dims);
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    size_t * const tensor_strides = ct_alloc_mem(sizeof(*tensor_strides) * max_dims);
     ASSERT(tensor_dims && tensor_strides);
-    
+
     // The strategy is a simple one: For each of the 1..max_dims supported,
     // we test a TEST_TENSOR_NUM_ITERATIONS of random tensor and LUT configs.
     // While LUT should be (Not verified) sufficiently tested by the Non NN
@@ -601,9 +812,9 @@
             printf("\t        }\n");
         }
 
-        void * const src_data = malloc(tensor_bytes);
-        void * const dst_data = malloc(tensor_bytes);
-        void * const lut_data = malloc(sizeof_data_type * lut_count);
+        void * const src_data = ct_alloc_mem(tensor_bytes);
+        void * const dst_data = ct_alloc_mem(tensor_bytes);
+        void * const lut_data = ct_alloc_mem(sizeof_data_type * lut_count);
         ASSERT(src_data && dst_data && lut_data);
 
         {   //TODO: ownTestInitTensors(..) ?
@@ -648,7 +859,7 @@
             VX_CALL(vxReleaseGraph(&graph));
             EXPECT_EQ_PTR(NULL, graph);
         }
-        
+
         // Verify the reuslts
         {
             const size_t view_start[MAX_TENSOR_DIMS] = { 0 };
@@ -742,14 +953,217 @@
         EXPECT_EQ_PTR(NULL, dst_tensor);
         EXPECT_EQ_PTR(NULL, lut);
 
-        free(src_data);
-        free(dst_data);
+        ct_free_mem(src_data);
+        ct_free_mem(dst_data);
     }
 
-    free(tensor_dims);
-    free(tensor_strides);
+    ct_free_mem(tensor_dims);
+    ct_free_mem(tensor_strides);
 }
 
+TEST_WITH_ARG(TensorOp, testvxuTensorTableLookup, test_tensor_lut_op_arg,
+        ARG("Q78_TABLELOOKUP", TT_Q78),
+        ARG("U8_TABLELOOKUP", TT_U8)
+)
+{
+    const vx_context context = context_->vx_context_;
+
+    const enum TestTensorDF fmt = arg_->fmt;
+    assert(fmt == TT_Q78 || fmt == TT_U8);
+
+    vx_size max_dims = 0;
+    {   // TODO: ownTestGetMaxDims() ?
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if(!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    vx_size lut_max_count = 0;
+    vx_enum lut_data_type = 0;
+    ownUnpackFormatForLUT(fmt, &lut_max_count, &lut_data_type);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    size_t * const tensor_strides = ct_alloc_mem(sizeof(*tensor_strides) * max_dims);
+    ASSERT(tensor_dims && tensor_strides);
+
+    // The strategy is a simple one: For each of the 1..max_dims supported,
+    // we test a TEST_TENSOR_NUM_ITERATIONS of random tensor and LUT configs.
+    // While LUT should be (Not verified) sufficiently tested by the Non NN
+    // tests, we preffer to use random LUT dims and data each iteration anyway
+    // since the whole test should't take long and this can be used as a
+    // standalone conformance part for our own tests.
+    //TODO: @Tomer, should we rather use a single (per fmt) randomly populated
+    //      LUT, instead, anyway? Or is this acceptable?
+
+    // Note that iter is the inner loop, so that if two implementations support
+    // D1 and D2 dims resp. the same (pseudo-random) values would be used when
+    // testing the common min(D1, D2) dimensions.
+    for (vx_size dims = 1; dims <= max_dims; ++dims)
+    for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
+    {
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("dims #: %zu,\titer #: %d\n", dims, iter);
+            fflush(stdout);
+        }
+
+        // First step is to get some random dim sizes, calc the strides and create the tensors.
+
+        for (vx_size i = 0; i < dims; ++i)
+        {
+            tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+
+            tensor_strides[i] = i ? tensor_strides[i-1] * tensor_dims[i-1] : sizeof_data_type;
+        }
+
+        vx_tensor src_tensor = vxCreateTensor(context, dims, tensor_dims, data_type, fixed_point_position);
+        vx_tensor dst_tensor = vxCreateTensor(context, dims, tensor_dims, data_type, fixed_point_position);
+        ASSERT_VX_OBJECT(src_tensor, VX_TYPE_TENSOR);
+        ASSERT_VX_OBJECT(dst_tensor, VX_TYPE_TENSOR);
+
+        const size_t tensor_bytes = tensor_dims[dims-1] * tensor_strides[dims-1];
+        const size_t tensor_count = tensor_bytes / sizeof_data_type;
+
+        const vx_size lut_count = (vx_size)CT_RNG_NEXT_INT(rng, 1, lut_max_count+1);
+        const vx_uint32 lut_offset = (lut_data_type == VX_TYPE_INT16) ? (vx_uint32)(lut_count / 2) : 0;
+
+        vx_lut lut = vxCreateLUT(context, lut_data_type, lut_count);
+        ASSERT_VX_OBJECT(lut, VX_TYPE_LUT);
+
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("\tconfig: {\n");
+            printf("\t          tensor_dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", tensor_dims[i]); } printf(" }, \n");
+            printf("\t          LUT_count: %zu,", lut_count);
+            printf("\t        }\n");
+        }
+
+        void * const src_data = ct_alloc_mem(tensor_bytes);
+        void * const dst_data = ct_alloc_mem(tensor_bytes);
+        void * const lut_data = ct_alloc_mem(sizeof_data_type * lut_count);
+        ASSERT(src_data && dst_data && lut_data);
+
+        {   //TODO: ownTestInitTensors(..) ?
+            ownFillRandDataForLUT(fmt, &rng, tensor_count, lut_count, lut_offset, src_data);
+
+            vx_size view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(src_tensor, dims, view_start, tensor_dims, tensor_strides, src_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+
+        {
+            for (size_t i = 0; i < lut_count; ++i)
+            {
+                switch (fmt)
+                {
+                case TT_Q78:
+                    ((vx_int16*)lut_data)[i] = (vx_int16)(CT_RNG_NEXT_INT(rng, INT16_MIN, INT16_MAX + 1));
+                    break;
+                case TT_U8:
+                    ((vx_uint8*)lut_data)[i] = (vx_uint8)(CT_RNG_NEXT_INT(rng, 0, UINT8_MAX + 1));
+                    break;
+                default: assert(0);
+                }
+            }
+
+            VX_CALL(vxCopyLUT(lut, lut_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+
+        // Third step is creating, running and disposing of the graph.
+        {
+            VX_CALL(vxuTensorTableLookup(context, src_tensor, lut, dst_tensor));
+        }
+
+        // Verify the reuslts
+        {
+            const size_t view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(dst_tensor, dims, view_start, tensor_dims, tensor_strides, dst_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+            for (size_t index = 0; index < tensor_count; ++index)
+            {
+                const size_t tensor_byte_offset = ownGetFlatByteOffset(index, dims, tensor_dims, tensor_strides);
+
+                switch(fmt)
+                {
+                case TT_Q78:
+                {
+                    const vx_int16 res = *(vx_int16*)((char*)dst_data + tensor_byte_offset);
+                    const vx_int16 val = *(vx_int16*)((char*)src_data + tensor_byte_offset);
+                    const int16_t ref = *((vx_int16*)lut_data + (size_t)((int32_t)lut_offset + (int32_t)val));
+
+                    if (res != ref)
+                    {
+                        printf("DIFF!!!\t\t{ src[%zu] : %f (raw: %d), LUT[%d + %u]: %f (raw: %d), res[%zu]: %f (raw: %d) }\n",
+                            tensor_byte_offset / sizeof(vx_int16), val / 256.f, val,
+                            val, lut_offset, ref / 256.f, ref,
+                            tensor_byte_offset / sizeof(vx_int16), res / 256.f, res);
+                    }
+                    if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR)
+                    {
+                        ASSERT_EQ_INT(res, ref);
+                    }
+                    else
+                    {
+                        EXPECT_EQ_INT(res, ref);
+                    }
+                }
+                break;
+                case TT_U8:
+                {
+                    const vx_uint8 res = *(vx_uint8*)((char*)dst_data + tensor_byte_offset);
+                    const vx_uint8 val = *(vx_uint8*)((char*)src_data + tensor_byte_offset);
+                    const uint8_t ref = *((vx_uint8*)lut_data + (size_t)((int32_t)lut_offset + (int32_t)val));
+
+                    if (res != ref)
+                    {
+                        printf("DIFF!!!\t\t{ src[%zu] : %d, LUT[%d + %u]: %d, res[%zu]: %d }\n",
+                            tensor_byte_offset / sizeof(vx_uint8), val,
+                            val, lut_offset, ref,
+                            tensor_byte_offset / sizeof(vx_uint8), res);
+                    }
+                    if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR)
+                    {
+                        ASSERT_EQ_INT(res, ref);
+                    }
+                    else
+                    {
+                        EXPECT_EQ_INT(res, ref);
+                    }
+                }
+                break;
+                default: assert(0);
+                }
+            }
+        }
+
+        VX_CALL(vxReleaseTensor(&src_tensor));
+        VX_CALL(vxReleaseTensor(&dst_tensor));
+        VX_CALL(vxReleaseLUT(&lut));
+
+        EXPECT_EQ_PTR(NULL, src_tensor);
+        EXPECT_EQ_PTR(NULL, dst_tensor);
+        EXPECT_EQ_PTR(NULL, lut);
+
+        ct_free_mem(src_data);
+        ct_free_mem(dst_data);
+    }
+
+    ct_free_mem(tensor_dims);
+    ct_free_mem(tensor_strides);
+}
+
+
 /****************************************************************************
  *                                                                          *
  *                          Test vxTensorTransposeNode                      *
@@ -763,7 +1177,7 @@
     enum TestTensorDF fmt;
 } test_tensor_transpose_op_arg;
 
-TEST_WITH_ARG(TensorOp, testTensorTransposeOp, test_tensor_transpose_op_arg,
+TEST_WITH_ARG(TensorOp, testvxTensorTranspose, test_tensor_transpose_op_arg,
         ARG("Q78_TRANSPOSE", TT_Q78),
         ARG("U8_TRANSPOSE", TT_U8),
         ARG("S8_TRANSPOSE", TT_S8),
@@ -788,25 +1202,25 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
-    size_t * const src_dims = malloc(sizeof(*src_dims) * max_dims);
-    size_t * const dst_dims = malloc(sizeof(*dst_dims) * max_dims);
+    size_t * const src_dims = ct_alloc_mem(sizeof(*src_dims) * max_dims);
+    size_t * const dst_dims = ct_alloc_mem(sizeof(*dst_dims) * max_dims);
     ASSERT(src_dims && dst_dims);
 
     //TODO: fix the following comment after its settlted :)
     // The way we implement the transposed query is simply swapping 2 of the
     // relevant dims strides in swizzled strides compared to original ones
-    size_t * const src_strides = malloc(sizeof(*src_strides) * max_dims);
-    size_t * const dst_strides = malloc(sizeof(*dst_strides) * max_dims);
-    size_t * const ref_strides = malloc(sizeof(*ref_strides) * max_dims);
+    size_t * const src_strides = ct_alloc_mem(sizeof(*src_strides) * max_dims);
+    size_t * const dst_strides = ct_alloc_mem(sizeof(*dst_strides) * max_dims);
+    size_t * const ref_strides = ct_alloc_mem(sizeof(*ref_strides) * max_dims);
     ASSERT(src_strides && dst_strides && ref_strides);
 
     //TODO: @Tomer, should swapping a dim with itself be acceptable?
-    
+
     // The strategy is a simple one: For each of the 1..max_dims supported,
     // we test all n^2 possible 2 dim combos for transposition.
     // We choose to do so since $sum_{n=1}^{max_dims} n ^2 ~ O(n^3)# which
@@ -821,7 +1235,7 @@
     // sequential values since the S8/U8 types would force a short repeating
     // pattern making it slightly harder to debug and possibly missing
     // perfectly aligned tranpose cases, however unlikely... :)
-    
+
     // Note that iter is the inner loop, so that if two implementations support
     // D1 and D2 dims resp. the same (pseudo-random) values would be used when
     // testing the common min(D1, D2) dimensions.
@@ -876,15 +1290,15 @@
             printf("            tensor_transpose_dims: { %zu, %zu }\n", transpose_dim0, transpose_dim1);
             printf("\t        }\n");
         }
-        
+
         //TODO: This is pretty wasteful as it's repeating a lot of work per iteration:
         //      Both in the repeated malloc + free and inefficient data population
         //      which discards much of the random data, only using a part of it.
 
         // Second step is to allocate the input and output data locations and populate the inputs.
 
-        void * const src_data = malloc(bytes);
-        void * const dst_data = malloc(bytes);
+        void * const src_data = ct_alloc_mem(bytes);
+        void * const dst_data = ct_alloc_mem(bytes);
         ASSERT(src_data && dst_data);
 
         {   //TODO: ownTestInitTensors(..) ?
@@ -989,7 +1403,7 @@
                 }
                 break;
                 default: assert(0);
-                } 
+                }
             }
         }
 
@@ -998,16 +1412,251 @@
         EXPECT_EQ_PTR(NULL, src_tensor);
         EXPECT_EQ_PTR(NULL, dst_tensor);
 
-        free(src_data);
-        free(dst_data);
+        ct_free_mem(src_data);
+        ct_free_mem(dst_data);
     }
 
-    free(src_dims);
-    free(dst_dims);
+    ct_free_mem(src_dims);
+    ct_free_mem(dst_dims);
 
-    free(src_strides);
-    free(dst_strides);
-    free(ref_strides);
+    ct_free_mem(src_strides);
+    ct_free_mem(dst_strides);
+    ct_free_mem(ref_strides);
+}
+
+TEST_WITH_ARG(TensorOp, testvxuTensorTranspose, test_tensor_transpose_op_arg,
+        ARG("Q78_TRANSPOSE", TT_Q78),
+        ARG("U8_TRANSPOSE", TT_U8),
+        ARG("S8_TRANSPOSE", TT_S8),
+)
+{
+    const vx_context context = context_->vx_context_;
+
+    const enum TestTensorDF fmt = arg_->fmt;
+    assert(fmt == TT_Q78 || fmt == TT_U8 || fmt == TT_S8);
+
+    vx_size max_dims = 0;
+    {   // TODO: ownTestGetMaxDims() ?
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if(!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    size_t * const src_dims = ct_alloc_mem(sizeof(*src_dims) * max_dims);
+    size_t * const dst_dims = ct_alloc_mem(sizeof(*dst_dims) * max_dims);
+    ASSERT(src_dims && dst_dims);
+
+    //TODO: fix the following comment after its settlted :)
+    // The way we implement the transposed query is simply swapping 2 of the
+    // relevant dims strides in swizzled strides compared to original ones
+    size_t * const src_strides = ct_alloc_mem(sizeof(*src_strides) * max_dims);
+    size_t * const dst_strides = ct_alloc_mem(sizeof(*dst_strides) * max_dims);
+    size_t * const ref_strides = ct_alloc_mem(sizeof(*ref_strides) * max_dims);
+    ASSERT(src_strides && dst_strides && ref_strides);
+
+    //TODO: @Tomer, should swapping a dim with itself be acceptable?
+
+    // The strategy is a simple one: For each of the 1..max_dims supported,
+    // we test all n^2 possible 2 dim combos for transposition.
+    // We choose to do so since $sum_{n=1}^{max_dims} n ^2 ~ O(n^3)# which
+    // isn't much for any practical number of supported dimensions.
+    // An alternative method could be similar to the one used in the
+    // Elementwise Op tests, where we ran TEST_TENSOR_NUM_ITERATIONS iters
+    // with random 2 dim choice. But for practical values of max_dims (~6?)
+    // it's hardly any different.
+    //TODO: @Tomer, do you preffer the ranom approach?
+    //
+    // Not that we still chose to use the psuedo random data rather than
+    // sequential values since the S8/U8 types would force a short repeating
+    // pattern making it slightly harder to debug and possibly missing
+    // perfectly aligned tranpose cases, however unlikely... :)
+
+    // Note that iter is the inner loop, so that if two implementations support
+    // D1 and D2 dims resp. the same (pseudo-random) values would be used when
+    // testing the common min(D1, D2) dimensions.
+    //TODO: If a single dim cannot be "transposed with itself" (copy/NOP for virt), start from 2
+    for (vx_size dims = 1; dims <= max_dims; ++dims)
+    for (vx_size transpose_dim0 = 0; transpose_dim0 < dims; ++transpose_dim0)
+    for (vx_size transpose_dim1 = 1; transpose_dim1 < dims; ++transpose_dim1)
+    {
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("dims: %zu, transpose_dim0: %zu, transpose_dim1: %zu\n", dims, transpose_dim0, transpose_dim1);
+            fflush(stdout);
+        }
+
+        // First step is to get some random dim sizes, calc the strides and create the tensors.
+
+        {
+            for (vx_size i = 0; i < dims; ++i)
+            {
+                src_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+                dst_dims[i] = src_dims[i];
+
+                src_strides[i] = i ? src_strides[i - 1] * src_dims[i - 1] : sizeof_data_type;
+                ref_strides[i] = src_strides[i];
+            }
+
+            dst_dims[transpose_dim1] = src_dims[transpose_dim0];
+            dst_dims[transpose_dim0] = src_dims[transpose_dim1];
+            ref_strides[transpose_dim1] = src_strides[transpose_dim0];
+            ref_strides[transpose_dim0] = src_strides[transpose_dim1];
+
+            for (vx_size i = 0; i < dims; ++i)
+            {
+                dst_strides[i] = i ? dst_strides[i - 1] * dst_dims[i - 1] : sizeof_data_type;
+            }
+        }
+
+        vx_tensor src_tensor = vxCreateTensor(context, dims, src_dims, data_type, fixed_point_position);
+        vx_tensor dst_tensor = vxCreateTensor(context, dims, dst_dims, data_type, fixed_point_position);
+        ASSERT_VX_OBJECT(src_tensor, VX_TYPE_TENSOR);
+        ASSERT_VX_OBJECT(dst_tensor, VX_TYPE_TENSOR);
+
+        const size_t bytes = src_dims[dims - 1] * src_strides[dims - 1];
+        const size_t count = bytes / sizeof_data_type;
+
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("\tconfig: {\n");
+            printf("\t          src_dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", src_dims[i]); } printf(" },\n");
+            printf("\t          dst_dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", dst_dims[i]); } printf(" },\n");
+            printf("            count: %zu, bytes: %zu,\n", count, bytes);
+            printf("            tensor_transpose_dims: { %zu, %zu }\n", transpose_dim0, transpose_dim1);
+            printf("\t        }\n");
+        }
+
+        //TODO: This is pretty wasteful as it's repeating a lot of work per iteration:
+        //      Both in the repeated malloc + free and inefficient data population
+        //      which discards much of the random data, only using a part of it.
+
+        // Second step is to allocate the input and output data locations and populate the inputs.
+
+        void * const src_data = ct_alloc_mem(bytes);
+        void * const dst_data = ct_alloc_mem(bytes);
+        ASSERT(src_data && dst_data);
+
+        {   //TODO: ownTestInitTensors(..) ?
+            ownFillRandData(fmt, &rng, count, src_data);
+
+            vx_size view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(src_tensor, dims, view_start, src_dims, src_strides, src_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+
+        // Third step is creating, running and disposing of the graph.
+        {
+            VX_CALL(vxuTensorTranspose(context, src_tensor, dst_tensor, transpose_dim0, transpose_dim1));
+        }
+
+        // Verify the results
+        {
+            const size_t view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(dst_tensor, dims, view_start, dst_dims, dst_strides, dst_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+            for (size_t index = 0; index < count; ++index)
+            {
+                const size_t res_byte_offset = ownGetFlatByteOffset(index, dims, dst_dims, dst_strides);
+                const size_t ref_byte_offset = ownGetFlatByteOffset(index, dims, dst_dims, ref_strides);
+
+                //TODO: can unify the following to avoid the copy pasta...
+
+                switch(fmt)
+                {
+                case TT_Q78:
+                {
+                    const vx_int16 res = *(vx_int16*)((char*)dst_data + res_byte_offset);
+                    const vx_int16 ref = *(vx_int16*)((char*)src_data + ref_byte_offset);
+
+                    if (res != ref)
+                    {
+                        printf("DIFF!!!\t\t{ src[%zu]: %f (raw: %d), dst[%zu]: %f (raw: %d) }\n",
+                            ref_byte_offset / sizeof(vx_int16), ref / 256.f, ref,
+                            res_byte_offset / sizeof(vx_int16), res / 256.f, res);
+                    }
+                    if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR)
+                    {
+                        ASSERT_EQ_INT(res, ref);
+                    }
+                    else
+                    {
+                        EXPECT_EQ_INT(res, ref);
+                    }
+                }
+                break;
+                case TT_U8:
+                {
+                    const vx_uint8 res = *(vx_uint8*)((char*)dst_data + res_byte_offset);
+                    const vx_uint8 ref = *(vx_uint8*)((char*)src_data + ref_byte_offset);
+
+                    if (res != ref)
+                    {
+                        printf("DIFF!!!\t\t{ src[%zu]: %d, dst[%zu]: %d }\n",
+                            ref_byte_offset / sizeof(vx_uint8), ref,
+                            res_byte_offset / sizeof(vx_uint8), res);
+                    }
+                    if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR)
+                    {
+                        ASSERT_EQ_INT(res, ref);
+                    }
+                    else
+                    {
+                        EXPECT_EQ_INT(res, ref);
+                    }
+                }
+                break;
+                case TT_S8:
+                {
+                    const vx_int8 res = *(vx_int8*)((char*)dst_data + res_byte_offset);
+                    const vx_int8 ref = *(vx_int8*)((char*)src_data + ref_byte_offset);
+
+                    if (res != ref)
+                    {
+                        printf("DIFF!!!\t\t{ src[%zu]: %d, dst[%zu]: %d }\n",
+                            ref_byte_offset / sizeof(vx_int8), ref,
+                            res_byte_offset / sizeof(vx_int8), res);
+                    }
+                    if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR)
+                    {
+                        ASSERT_EQ_INT(res, ref);
+                    }
+                    else
+                    {
+                        EXPECT_EQ_INT(res, ref);
+                    }
+                }
+                break;
+                default: assert(0);
+                }
+            }
+        }
+
+        VX_CALL(vxReleaseTensor(&src_tensor));
+        VX_CALL(vxReleaseTensor(&dst_tensor));
+        EXPECT_EQ_PTR(NULL, src_tensor);
+        EXPECT_EQ_PTR(NULL, dst_tensor);
+
+        ct_free_mem(src_data);
+        ct_free_mem(dst_data);
+    }
+
+    ct_free_mem(src_dims);
+    ct_free_mem(dst_dims);
+
+    ct_free_mem(src_strides);
+    ct_free_mem(dst_strides);
+    ct_free_mem(ref_strides);
 }
 
 /****************************************************************************
@@ -1029,7 +1678,7 @@
 } test_tensor_convert_depth_op_arg;
 
 //TODO: what kind of configs do we want to test? It doesn't have to be full width conversions
-TEST_WITH_ARG(TensorOp, testTensorConvertDepthOp, test_tensor_convert_depth_op_arg,
+TEST_WITH_ARG(TensorOp, testvxTensorConvertDepth, test_tensor_convert_depth_op_arg,
         ARG("DEPTH_CONVERT_SAT_Q78_TO_Q78_FULL", VX_CONVERT_POLICY_SATURATE, TT_Q78, TT_Q78, 0.f, 1.f),
         ARG("DEPTH_CONVERT_SAT_Q78_TO_U8_FULL", VX_CONVERT_POLICY_SATURATE, TT_Q78, TT_U8, 128.f, 1.f),
         ARG("DEPTH_CONVERT_SAT_Q78_TO_S8_FULL", VX_CONVERT_POLICY_SATURATE, TT_Q78, TT_S8, 0.f, 1.f),
@@ -1078,18 +1727,18 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum src_data_type;
-    vx_enum dst_data_type;
-    vx_uint8 src_fixed_point_position;
-    vx_uint8 dst_fixed_point_position;
-    vx_size src_sizeof_data_type;
-    vx_size dst_sizeof_data_type;
+    vx_enum src_data_type = 0;
+    vx_enum dst_data_type = 0;
+    vx_uint8 src_fixed_point_position = 0;
+    vx_uint8 dst_fixed_point_position = 0;
+    vx_size src_sizeof_data_type = 0;
+    vx_size dst_sizeof_data_type = 0;
     ownUnpackFormat(src_fmt, &src_data_type, &src_fixed_point_position, &src_sizeof_data_type);
     ownUnpackFormat(dst_fmt, &dst_data_type, &dst_fixed_point_position, &dst_sizeof_data_type);
 
-    size_t * const tensor_dims = malloc(sizeof(*tensor_dims) * max_dims);
-    size_t * const src_tensor_strides = malloc(sizeof(*src_tensor_strides) * max_dims);
-    size_t * const dst_tensor_strides = malloc(sizeof(*dst_tensor_strides) * max_dims);
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    size_t * const src_tensor_strides = ct_alloc_mem(sizeof(*src_tensor_strides) * max_dims);
+    size_t * const dst_tensor_strides = ct_alloc_mem(sizeof(*dst_tensor_strides) * max_dims);
     ASSERT(tensor_dims && src_tensor_strides && dst_tensor_strides);
 
     //TODO: what's the testing strategy here? missing desc.
@@ -1132,8 +1781,8 @@
             printf("\t        }\n");
         }
 
-        void * const src_data = malloc(src_tensor_bytes);
-        void * const dst_data = malloc(dst_tensor_bytes);
+        void * const src_data = ct_alloc_mem(src_tensor_bytes);
+        void * const dst_data = ct_alloc_mem(dst_tensor_bytes);
         ASSERT(src_data && dst_data);
 
         {   //TODO: ownTestInitTensors(..) ?
@@ -1183,7 +1832,7 @@
                 const size_t src_tensor_byte_offset = ownGetFlatByteOffset(index, dims, tensor_dims, src_tensor_strides);
                 const size_t dst_tensor_byte_offset = ownGetFlatByteOffset(index, dims, tensor_dims, dst_tensor_strides);
 
-                float tmp;
+                float tmp = .0f;
 
                 switch(src_fmt)
                 {
@@ -1241,13 +1890,222 @@
         EXPECT_EQ_PTR(NULL, src_tensor);
         EXPECT_EQ_PTR(NULL, dst_tensor);
 
-        free(src_data);
-        free(dst_data);
+        ct_free_mem(src_data);
+        ct_free_mem(dst_data);
     }
 
-    free(tensor_dims);
-    free(src_tensor_strides);
-    free(dst_tensor_strides);
+    ct_free_mem(tensor_dims);
+    ct_free_mem(src_tensor_strides);
+    ct_free_mem(dst_tensor_strides);
+}
+
+TEST_WITH_ARG(TensorOp, testvxuTensorConvertDepth, test_tensor_convert_depth_op_arg,
+        ARG("DEPTH_CONVERT_SAT_Q78_TO_Q78_FULL", VX_CONVERT_POLICY_SATURATE, TT_Q78, TT_Q78, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_Q78_TO_U8_FULL", VX_CONVERT_POLICY_SATURATE, TT_Q78, TT_U8, 128.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_Q78_TO_S8_FULL", VX_CONVERT_POLICY_SATURATE, TT_Q78, TT_S8, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_U8_TO_Q78_FULL", VX_CONVERT_POLICY_SATURATE, TT_U8, TT_Q78, -128.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_U8_TO_U8_FULL", VX_CONVERT_POLICY_SATURATE, TT_U8, TT_U8, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_U8_TO_S8_FULL", VX_CONVERT_POLICY_SATURATE, TT_U8, TT_S8, -128.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_S8_TO_Q78_FULL", VX_CONVERT_POLICY_SATURATE, TT_S8, TT_Q78, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_S8_TO_U8_FULL", VX_CONVERT_POLICY_SATURATE, TT_S8, TT_U8, 128.f, 1.f),
+        ARG("DEPTH_CONVERT_SAT_S8_TO_S8_FULL", VX_CONVERT_POLICY_SATURATE, TT_S8, TT_S8, 0.f, 1.f),
+
+        ARG("DEPTH_CONVERT_WRAP_Q78_TO_Q78_FULL", VX_CONVERT_POLICY_WRAP, TT_Q78, TT_Q78, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_Q78_TO_U8_FULL", VX_CONVERT_POLICY_WRAP, TT_Q78, TT_U8, 128.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_Q78_TO_S8_FULL", VX_CONVERT_POLICY_WRAP, TT_Q78, TT_S8, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_U8_TO_Q78_FULL", VX_CONVERT_POLICY_WRAP, TT_U8, TT_Q78, -128.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_U8_TO_U8_FULL", VX_CONVERT_POLICY_WRAP, TT_U8, TT_U8, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_U8_TO_S8_FULL", VX_CONVERT_POLICY_WRAP, TT_U8, TT_S8, -128.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_S8_TO_Q78_FULL", VX_CONVERT_POLICY_WRAP, TT_S8, TT_Q78, 0.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_S8_TO_U8_FULL", VX_CONVERT_POLICY_WRAP, TT_S8, TT_U8, 128.f, 1.f),
+        ARG("DEPTH_CONVERT_WRAP_S8_TO_S8_FULL", VX_CONVERT_POLICY_WRAP, TT_S8, TT_S8, 0.f, 1.f),
+)
+{
+    const vx_context context = context_->vx_context_;
+
+    const enum TestTensorDF src_fmt = arg_->src_fmt;
+    const enum TestTensorDF dst_fmt = arg_->dst_fmt;
+    assert(src_fmt == TT_Q78 || src_fmt == TT_U8 || src_fmt == TT_S8);
+    assert(dst_fmt == TT_Q78 || dst_fmt == TT_U8 || dst_fmt == TT_S8);
+
+    const enum vx_convert_policy_e policy = arg_->policy;
+    assert(policy == VX_CONVERT_POLICY_SATURATE || policy == VX_CONVERT_POLICY_WRAP);
+
+    const float offset = arg_->offset;
+    const float norm = arg_->norm;
+
+    vx_size max_dims = 0;
+    {   // TODO: ownTestGetMaxDims() ?
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if(!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum src_data_type = 0;
+    vx_enum dst_data_type = 0;
+    vx_uint8 src_fixed_point_position = 0;
+    vx_uint8 dst_fixed_point_position = 0;
+    vx_size src_sizeof_data_type = 0;
+    vx_size dst_sizeof_data_type = 0;
+    ownUnpackFormat(src_fmt, &src_data_type, &src_fixed_point_position, &src_sizeof_data_type);
+    ownUnpackFormat(dst_fmt, &dst_data_type, &dst_fixed_point_position, &dst_sizeof_data_type);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    size_t * const src_tensor_strides = ct_alloc_mem(sizeof(*src_tensor_strides) * max_dims);
+    size_t * const dst_tensor_strides = ct_alloc_mem(sizeof(*dst_tensor_strides) * max_dims);
+    ASSERT(tensor_dims && src_tensor_strides && dst_tensor_strides);
+
+    //TODO: what's the testing strategy here? missing desc.
+
+    // Note that iter is the inner loop, so that if two implementations support
+    // D1 and D2 dims resp. the same (pseudo-random) values would be used when
+    // testing the common min(D1, D2) dimensions.
+    for (vx_size dims = 1; dims <= max_dims; ++dims)
+    for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
+    {
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("dims #: %zu,\titer #: %d\n", dims, iter);
+            fflush(stdout);
+        }
+
+        // First step is to get some random dim sizes, calc the strides and create the tensors.
+
+        for (vx_size i = 0; i < dims; ++i)
+        {
+            tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+
+            src_tensor_strides[i] = i ? src_tensor_strides[i-1] * tensor_dims[i-1] : src_sizeof_data_type;
+            dst_tensor_strides[i] = i ? dst_tensor_strides[i-1] * tensor_dims[i-1] : dst_sizeof_data_type;
+        }
+
+        vx_tensor src_tensor = vxCreateTensor(context, dims, tensor_dims, src_data_type, src_fixed_point_position);
+        vx_tensor dst_tensor = vxCreateTensor(context, dims, tensor_dims, dst_data_type, dst_fixed_point_position);
+        ASSERT_VX_OBJECT(src_tensor, VX_TYPE_TENSOR);
+        ASSERT_VX_OBJECT(dst_tensor, VX_TYPE_TENSOR);
+
+        const size_t src_tensor_bytes = tensor_dims[dims-1] * src_tensor_strides[dims-1];
+        const size_t dst_tensor_bytes = tensor_dims[dims-1] * dst_tensor_strides[dims-1];
+        const size_t count = src_tensor_bytes / src_sizeof_data_type;
+
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("\tconfig: {\n");
+            printf("\t          tensor_dims: { "); for (size_t i = 0; i < dims; ++i) { printf("%zu, ", tensor_dims[i]); } printf(" }, \n");
+            printf("\t        }\n");
+        }
+
+        void * const src_data = ct_alloc_mem(src_tensor_bytes);
+        void * const dst_data = ct_alloc_mem(dst_tensor_bytes);
+        ASSERT(src_data && dst_data);
+
+        {   //TODO: ownTestInitTensors(..) ?
+            ownFillRandData(src_fmt, &rng, count, src_data);
+
+            vx_size view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(src_tensor, dims, view_start, tensor_dims, src_tensor_strides, src_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+
+        // Third step is creating, running and disposing of the graph.
+        {
+            vx_scalar norm_sc = vxCreateScalar(context, VX_TYPE_FLOAT32, &norm);
+            vx_scalar offset_sc = vxCreateScalar(context, VX_TYPE_FLOAT32, &offset);
+            ASSERT_VX_OBJECT(norm_sc, VX_TYPE_SCALAR);
+            ASSERT_VX_OBJECT(offset_sc, VX_TYPE_SCALAR);
+
+            VX_CALL(vxuTensorConvertDepth(context, src_tensor, policy, norm_sc, offset_sc, dst_tensor));
+
+            VX_CALL(vxReleaseScalar(&norm_sc));
+            VX_CALL(vxReleaseScalar(&offset_sc));
+            EXPECT_EQ_PTR(NULL, norm_sc);
+            EXPECT_EQ_PTR(NULL, offset_sc);
+        }
+
+        // Verify the reuslts
+        {
+            const size_t view_start[MAX_TENSOR_DIMS] = { 0 };
+            VX_CALL(vxCopyTensorPatch(dst_tensor, dims, view_start, tensor_dims, dst_tensor_strides, dst_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+            const float scale = 1.f / norm;
+            const bool wrap = policy == VX_CONVERT_POLICY_WRAP;
+
+            for (size_t index = 0; index < count; ++index)
+            {
+                const size_t src_tensor_byte_offset = ownGetFlatByteOffset(index, dims, tensor_dims, src_tensor_strides);
+                const size_t dst_tensor_byte_offset = ownGetFlatByteOffset(index, dims, tensor_dims, dst_tensor_strides);
+
+                float tmp = .0f;
+
+                switch(src_fmt)
+                {
+                case TT_Q78:
+                  tmp = *(vx_int16*)((char*)src_data + src_tensor_byte_offset);
+                    tmp /= Q78_SCALE;
+                    break;
+                case TT_U8:
+                    tmp = *(vx_uint8*)((char*)src_data + src_tensor_byte_offset);
+                    break;
+                case TT_S8:
+                    tmp = *(vx_int8*)((char*)src_data + src_tensor_byte_offset);
+                    break;
+                default: assert(0);
+                }
+
+                tmp = (tmp - offset) * scale;
+
+                //TODO: missing allowed eps
+                //TODO: missing diff printf
+                switch(dst_fmt)
+                {
+                case TT_Q78:
+                    {
+                        tmp *= Q78_SCALE;
+                        vx_int16 ref = wrap ? (vx_int16)tmp : CLAMP(tmp, INT16_MIN, INT16_MAX); //TODO: cast issue?
+                        vx_int16 res = *(vx_int16*)((char*)dst_data + dst_tensor_byte_offset);
+                        if (res != ref) printf("DIFF!!!\n");
+                        if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR) ASSERT_EQ_INT(res, ref); else EXPECT_EQ_INT(res, ref);
+                    }
+                    break;
+                case TT_U8:
+                    {
+                        vx_uint8 ref = wrap ? (vx_uint8)tmp : CLAMP(tmp, 0, UINT8_MAX);  // CLAMP not really needed
+                        vx_uint8 res = *(vx_uint8*)((char*)dst_data + dst_tensor_byte_offset);
+                        if (res != ref) printf("DIFF!!!\n");
+                        if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR) ASSERT_EQ_INT(res, ref); else EXPECT_EQ_INT(res, ref);
+                    }
+                    break;
+                case TT_S8:
+                    {
+                        vx_int8 ref = wrap ? (vx_int8)tmp : (vx_int8)CLAMP(tmp, INT8_MIN, INT8_MAX); //TODO: cast issue?
+                        vx_int8 res = *(vx_int8*)((char*)dst_data + dst_tensor_byte_offset);
+                        if (res != ref) printf("DIFF!!!\n");
+                        if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR) ASSERT_EQ_INT(res, ref); else EXPECT_EQ_INT(res, ref);
+                    }
+                    break;
+                default: assert(0);
+                }
+            }
+        }
+
+        VX_CALL(vxReleaseTensor(&src_tensor));
+        VX_CALL(vxReleaseTensor(&dst_tensor));
+        EXPECT_EQ_PTR(NULL, src_tensor);
+        EXPECT_EQ_PTR(NULL, dst_tensor);
+
+        ct_free_mem(src_data);
+        ct_free_mem(dst_data);
+    }
+
+    ct_free_mem(tensor_dims);
+    ct_free_mem(src_tensor_strides);
+    ct_free_mem(dst_tensor_strides);
 }
 
 
@@ -1385,7 +2243,7 @@
     TT_TENSOR_MAD_0(U8)     \
     TT_TENSOR_MAD_0(S8)
 
-TEST_WITH_ARG(TensorOp, testTensorMatrixMultiplyOp, test_tensor_matrix_multiply_op_arg,
+TEST_WITH_ARG(TensorOp, testvxTensorMatrixMultiply, test_tensor_matrix_multiply_op_arg,
         TT_TENSOR_MAD_ALL()
 )
 {
@@ -1403,9 +2261,9 @@
         CT_RNG_INIT(rng, *seed);
     }
 
-    vx_enum data_type;
-    vx_uint8 fixed_point_position;
-    vx_size sizeof_data_type;
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
     ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
 
     for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
@@ -1443,11 +2301,11 @@
         const vx_size c_strides[2] = { sizeof_data_type, sizeof_data_type * c_dims[0] };
         const vx_size out_strides[2] = { sizeof_data_type, sizeof_data_type * out_dims[0] };
 
-        void * a_data = malloc(m * n * sizeof_data_type);
-        void * b_data = malloc(n * k * sizeof_data_type);
-        void * c_data = arg_->c_present ? malloc(m * k * sizeof_data_type) : NULL;
-        void * out_data = malloc(m * k * sizeof_data_type);
-        void * ref_data = malloc(m * k * sizeof_data_type);
+        void * a_data = ct_alloc_mem(m * n * sizeof_data_type);
+        void * b_data = ct_alloc_mem(n * k * sizeof_data_type);
+        void * c_data = arg_->c_present ? ct_alloc_mem(m * k * sizeof_data_type) : NULL;
+        void * out_data = ct_alloc_mem(m * k * sizeof_data_type);
+        void * ref_data = ct_alloc_mem(m * k * sizeof_data_type);
         ASSERT(a_data && b_data && (!arg_->c_present || c_data) && out_data && ref_data);
 
         // Since we check the sum of products here, and te accumulator is only
@@ -1537,20 +2395,176 @@
         EXPECT_EQ_PTR(NULL, c_tensor);
         EXPECT_EQ_PTR(NULL, out_tensor);
 
-        free(a_data);
-        free(b_data);
-        free(c_data);
-        free(out_data);
+        ct_free_mem(a_data);
+        ct_free_mem(b_data);
+        ct_free_mem(c_data);
+        ct_free_mem(out_data);
     }
 }
 
+TEST_WITH_ARG(TensorOp, testvxuTensorMatrixMultiply, test_tensor_matrix_multiply_op_arg,
+        TT_TENSOR_MAD_ALL()
+)
+{
+    const vx_context context = context_->vx_context_;
+    vx_size max_dims = 0;
+    {   // TODO: ownTestGetMaxDims() ?
+        VX_CALL(vxQueryContext(context_->vx_context_, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if(!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position= 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(arg_->fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
+    {
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("iter #: %d\n", iter); fflush(stdout);
+        }
+
+        const vx_size m = (vx_size)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+        const vx_size n = (vx_size)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+        const vx_size k = (vx_size)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ+1);
+
+        // Not that unlike common GEMM, here we do not update an existing c but
+        // output to a different tensor!
+
+        const vx_size a_dims[2] = { arg_->a_transposed ? m : n, arg_->a_transposed ? n : m };
+        const vx_size b_dims[2] = { arg_->b_transposed ? n : k, arg_->b_transposed ? k : n };
+        const vx_size c_dims[2] = { arg_->c_transposed ? m : k, arg_->c_transposed ? k : m };
+        const vx_size out_dims[2] = { k, m };
+
+        if (DEBUG_TEST_TENSOR_ENABLE_PRINTF)
+        {
+            printf("\tconfig: {\n");
+            printf("\t          a_dims: { %zu, %zu },\n", a_dims[0], a_dims[1]);
+            printf("\t          b_dims: { %zu, %zu },\n", b_dims[0], b_dims[1]);
+            if (arg_->c_present)
+                printf("\t          c_dims: { %zu, %zu },\n", c_dims[0], c_dims[1]);
+            printf("\t          out_dims: { %zu, %zu },\n", out_dims[0], out_dims[1]);
+            printf("\t        }\n");
+        }
+
+        const vx_size a_strides[2] = { sizeof_data_type, sizeof_data_type * a_dims[0] };
+        const vx_size b_strides[2] = { sizeof_data_type, sizeof_data_type * b_dims[0] };
+        const vx_size c_strides[2] = { sizeof_data_type, sizeof_data_type * c_dims[0] };
+        const vx_size out_strides[2] = { sizeof_data_type, sizeof_data_type * out_dims[0] };
+
+        void * a_data = ct_alloc_mem(m * n * sizeof_data_type);
+        void * b_data = ct_alloc_mem(n * k * sizeof_data_type);
+        void * c_data = arg_->c_present ? ct_alloc_mem(m * k * sizeof_data_type) : NULL;
+        void * out_data = ct_alloc_mem(m * k * sizeof_data_type);
+        void * ref_data = ct_alloc_mem(m * k * sizeof_data_type);
+        ASSERT(a_data && b_data && (!arg_->c_present || c_data) && out_data && ref_data);
+
+        // Since we check the sum of products here, and te accumulator is only
+        // supposed to be 32 bits, we need smaller values so that the intermidiate
+        // results don't exceed it.
+        ownFillSmallRandData(arg_->fmt, &rng, m * n, a_dims[0] + 1, a_data);
+        ownFillSmallRandData(arg_->fmt, &rng, n * k, a_dims[0] + 1, b_data);
+        if (arg_->c_present) { ownFillSmallRandData(arg_->fmt, &rng, m * k, a_dims[0] + 1, c_data); }
+
+        vx_tensor a_tensor = vxCreateTensor(context_->vx_context_, 2, a_dims, data_type, fixed_point_position);
+        vx_tensor b_tensor = vxCreateTensor(context_->vx_context_, 2, b_dims, data_type, fixed_point_position);
+        vx_tensor c_tensor = arg_->c_present ? vxCreateTensor(context_->vx_context_, 2, c_dims, data_type, fixed_point_position) : NULL;
+        vx_tensor out_tensor = vxCreateTensor(context_->vx_context_, 2, out_dims, data_type, fixed_point_position);
+
+        ASSERT_VX_OBJECT(a_tensor, VX_TYPE_TENSOR);
+        ASSERT_VX_OBJECT(b_tensor, VX_TYPE_TENSOR);
+        if (arg_->c_present)
+        {
+            ASSERT_VX_OBJECT(c_tensor, VX_TYPE_TENSOR);
+        }
+        ASSERT_VX_OBJECT(out_tensor, VX_TYPE_TENSOR);
+
+        vx_size view_start[2] = { 0, 0 };
+        VX_CALL(vxCopyTensorPatch(a_tensor, 2, view_start, a_dims, a_strides, a_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        VX_CALL(vxCopyTensorPatch(b_tensor, 2, view_start, b_dims, b_strides, b_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        if (arg_->c_present)
+        {
+            VX_CALL(vxCopyTensorPatch(c_tensor, 2, view_start, c_dims, c_strides, c_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+
+        // Create, run vxuTensorMatrixMultiply
+        {
+            vx_tensor_matrix_multiply_params_t params = { arg_->a_transposed, arg_->b_transposed, arg_->c_transposed };
+            VX_CALL(vxuTensorMatrixMultiply(context, a_tensor, b_tensor, c_tensor, &params, out_tensor));
+        }
+
+        {
+            ownTensorMatrixMultiply(
+                    arg_->fmt,
+                    a_data, a_dims, a_strides, arg_->a_transposed,
+                    b_data, b_dims, b_strides, arg_->b_transposed,
+                    c_data, c_dims, c_strides, arg_->c_transposed,
+                    ref_data, out_dims, out_strides);
+
+            VX_CALL(vxCopyTensorPatch(out_tensor, 2, view_start, out_dims, out_strides, out_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+            size_t first_diff_index;
+            size_t first_diff_byte_offset0;
+            size_t first_diff_byte_offset1;
+            if (!ownExpectIdenticalData(
+                        arg_->fmt,
+                        out_data, out_dims, 2, out_strides,
+                        ref_data, out_dims, 2, out_strides,
+                        8, //(arg_->fmt == TT_Q78 ? 1 : 0),
+                        &first_diff_index,
+                        &first_diff_byte_offset0,
+                        &first_diff_byte_offset1))
+            {
+                printf("DIFF! { idx: %zu, out: ", first_diff_index);
+                ownPrettyPrintVal(arg_->fmt, (char*)out_data + first_diff_byte_offset0);
+                printf(", ref: ");
+                ownPrettyPrintVal(arg_->fmt, (char*)ref_data + first_diff_byte_offset1);
+                printf(" }\n");
+
+                if (!DEBUG_TEST_TENSOR_CONTINUE_AFTER_ERROR) ASSERT(0);
+            }
+        }
+
+        VX_CALL(vxReleaseTensor(&a_tensor));
+        VX_CALL(vxReleaseTensor(&b_tensor));
+        if (arg_->c_present) VX_CALL(vxReleaseTensor(&c_tensor));
+        VX_CALL(vxReleaseTensor(&out_tensor));
+        EXPECT_EQ_PTR(NULL, a_tensor);
+        EXPECT_EQ_PTR(NULL, b_tensor);
+        EXPECT_EQ_PTR(NULL, c_tensor);
+        EXPECT_EQ_PTR(NULL, out_tensor);
+
+        ct_free_mem(a_data);
+        ct_free_mem(b_data);
+        ct_free_mem(c_data);
+        ct_free_mem(out_data);
+    }
+}
+
+
 TESTCASE_TESTS(TensorOp,
     /* vx_nodes.h function tests */
-    testTensorElementwiseOp,
-    testTensorTableLookupOp,
-    testTensorTransposeOp,
-    testTensorConvertDepthOp,
-    testTensorMatrixMultiplyOp
+    testvxTensorElementwiseOp,
+    testvxuTensorElementwiseOp,
+    testvxTensorTableLookup,
+    testvxuTensorTableLookup,
+    testvxTensorTranspose,
+    testvxuTensorTranspose,
+    testvxTensorConvertDepth,
+    testvxuTensorConvertDepth,
+    testvxTensorMatrixMultiply,
+    testvxuTensorMatrixMultiply
     /* minigraph tests */
     /*, testTensorOpSanity*/
 )
+
+#endif //OPENVX_USE_ENHANCED_VISION
diff --git a/test_conformance/test_threshold.c b/test_conformance/test_threshold.c
index 778c815..fa0a629 100644
--- a/test_conformance/test_threshold.c
+++ b/test_conformance/test_threshold.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 
 #include <VX/vx.h>
@@ -28,7 +30,8 @@
     uint32_t x, y, width, height, srcstride, dststride;
 
     ASSERT(src && dst);
-    ASSERT((src->format == VX_DF_IMAGE_U8 || src->format == VX_DF_IMAGE_S16) && dst->format == VX_DF_IMAGE_U8);
+    ASSERT((src->format == VX_DF_IMAGE_U8 || src->format == VX_DF_IMAGE_S16) &&
+           (dst->format == VX_DF_IMAGE_U1 || dst->format == VX_DF_IMAGE_U8));
     ASSERT(src->width > 0 && src->height > 0 &&
            src->width == dst->width && src->height == dst->height);
     width = src->width;
@@ -45,16 +48,42 @@
             if( ttype == VX_THRESHOLD_TYPE_BINARY )
             {
                 for( x = 0; x < width; x++ )
-                    dstptr[x] = srcptr[x] > ta ? true_val : false_val;
+                {
+                    uint8_t dst_value = srcptr[x] > ta ? true_val : false_val;
+                    if (dst->format == VX_DF_IMAGE_U1)
+                    {
+                        uint32_t xShftd = x + dst->roi.x % 8;
+                        uint8_t  offset = xShftd % 8;
+                        dst_value = dst_value > 1 ? 1 : dst_value;
+                        dstptr[xShftd / 8] = (dstptr[xShftd / 8] & ~(1 << offset)) | (dst_value << offset);
+                    }
+                    else
+                    {
+                        dstptr[x] = dst_value;
+                    }
+                }
             }
-            else
+            else    // VX_THRESHOLD_TYPE_RANGE
             {
                 for( x = 0; x < width; x++ )
-                    dstptr[x] = srcptr[x] < ta || srcptr[x] > tb ? false_val : true_val;
+                {
+                    uint8_t dst_value = srcptr[x] < ta || srcptr[x] > tb ? false_val : true_val;
+                    if(dst->format == VX_DF_IMAGE_U1)
+                    {
+                        uint32_t xShftd = x + dst->roi.x % 8;
+                        uint8_t  offset = xShftd % 8;
+                        dst_value = dst_value > 1 ? 1 : dst_value;
+                        dstptr[xShftd / 8] = (dstptr[xShftd / 8] & ~(1 << offset)) | (dst_value << offset);
+                    }
+                    else
+                    {
+                        dstptr[x] = dst_value;
+                    }
+                }
             }
         }
     }
-    else
+    else    // src->format == VX_DF_IMAGE_S16
     {
         for( y = 0; y < height; y++ )
         {
@@ -68,52 +97,127 @@
                     dst_value = srcptr[x] > ta ? true_val : false_val;
 
                     dst_value = (dst_value < 0 ? 0 : dst_value);
-                    dst_value = (dst_value > UINT8_MAX ? UINT8_MAX : dst_value);
-                    dstptr[x] = (uint8_t)dst_value;
+                    if(dst->format == VX_DF_IMAGE_U1)
+                    {
+                        uint32_t xShftd = x + dst->roi.x % 8;
+                        uint8_t  offset = xShftd % 8;
+                        dst_value = (dst_value > 1 ? 1 : dst_value);
+                        dstptr[xShftd / 8] = (dstptr[xShftd / 8] & ~(1 << offset)) | ((uint8_t)dst_value << offset);
+                    }
+                    else
+                    {
+                        dst_value = (dst_value > UINT8_MAX ? UINT8_MAX : dst_value);
+                        dstptr[x] = (uint8_t)dst_value;
+                    }
                 }
             }
-            else
+            else    // VX_THRESHOLD_TYPE_RANGE
             {
                 for( x = 0; x < width; x++ )
                 {
                     dst_value = srcptr[x] < ta || srcptr[x] > tb ? false_val : true_val;
 
                     dst_value = (dst_value < 0 ? 0 : dst_value);
-                    dst_value = (dst_value > UINT8_MAX ? UINT8_MAX : dst_value);
-                    dstptr[x] = (uint8_t)dst_value;
+                    if(dst->format == VX_DF_IMAGE_U1)
+                    {
+                        uint32_t xShftd = x + dst->roi.x % 8;
+                        uint8_t  offset = xShftd % 8;
+                        dst_value = (dst_value > 1 ? 1 : dst_value);
+                        dstptr[xShftd / 8] = (dstptr[xShftd / 8] & ~(1 << offset)) | ((uint8_t)dst_value << offset);
+                    }
+                    else
+                    {
+                        dst_value = (dst_value > UINT8_MAX ? UINT8_MAX : dst_value);
+                        dstptr[x] = (uint8_t)dst_value;
+                    }
                 }
             }
         }
     }
 }
 
-
 TESTCASE(Threshold, CT_VXContext, ct_setup_vx_context, 0)
 
+#define CT_THRESHOLD_TRUE_VALUE  255
+#define CT_THRESHOLD_FALSE_VALUE 0
+
+typedef struct {
+    const char* name;
+    vx_enum src_type;
+    vx_enum dst_type;
+} threshold_create_arg;
+
+#define THRESHOLD_CREATE(src_type, dst_type)    {        #src_type "/" #dst_type, VX_DF_IMAGE_##src_type,  VX_DF_IMAGE_##dst_type}
+#define THRESHOLD_CREATE_U1(src_type, dst_type) {"_U1_/" #src_type "/" #dst_type, VX_DF_IMAGE_##src_type,  VX_DF_IMAGE_##dst_type}
+
+TEST_WITH_ARG(Threshold, testThresholdCreation, threshold_create_arg,
+              THRESHOLD_CREATE(U8, U8),
+              THRESHOLD_CREATE(S16, U8),
+              THRESHOLD_CREATE_U1(U8, U1),
+              )
+{
+    vx_context context = context_->vx_context_;
+    vx_enum thresh_type = VX_THRESHOLD_TYPE_BINARY;
+
+    vx_threshold threshold;
+    ASSERT_VX_OBJECT(threshold = vxCreateThresholdForImage(context, thresh_type, arg_->src_type, arg_->dst_type), VX_TYPE_THRESHOLD);
+
+    vx_df_image input_type, output_type;
+    vxQueryThreshold(threshold,  VX_THRESHOLD_INPUT_FORMAT, &input_type, sizeof(vx_df_image));
+    vxQueryThreshold(threshold,  VX_THRESHOLD_OUTPUT_FORMAT, &output_type, sizeof(vx_df_image));
+    ASSERT_EQ_INT(arg_->src_type, input_type);
+    ASSERT_EQ_INT(arg_->dst_type, output_type);
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseThreshold(&threshold));
+}
+
+TEST_WITH_ARG(Threshold, testVirtualThresholdCreation, threshold_create_arg,
+              THRESHOLD_CREATE(U8, U8),
+              THRESHOLD_CREATE(S16, U8),
+              THRESHOLD_CREATE_U1(U8, U1),
+              )
+{
+    vx_context context = context_->vx_context_;
+    vx_enum thresh_type = VX_THRESHOLD_TYPE_BINARY;
+    vx_graph graph = vxCreateGraph(context);
+
+    vx_threshold threshold;
+    ASSERT_VX_OBJECT(threshold = vxCreateVirtualThresholdForImage(graph, thresh_type, arg_->src_type, arg_->dst_type), VX_TYPE_THRESHOLD);
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseThreshold(&threshold));
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseGraph(&graph));
+}
+
 typedef struct {
     const char* name;
     int mode;
     vx_enum ttype;
-    int format;
+    int in_format;
+    int out_format;
 } format_arg;
 
-#define THRESHOLD_CASE(imm, ttype, format) { #imm "/" #ttype "/" #format "/U8", CT_##imm##_MODE, VX_THRESHOLD_TYPE_##ttype, VX_DF_IMAGE_##format}
-
-#define CT_THRESHOLD_TRUE_VALUE  255
-#define CT_THRESHOLD_FALSE_VALUE 0
+#define THRESHOLD_CASE(imm, ttype, in_format, out_format)    {        #imm "/" #ttype "/" #in_format "/" #out_format, \
+    CT_##imm##_MODE, VX_THRESHOLD_TYPE_##ttype, VX_DF_IMAGE_##in_format, VX_DF_IMAGE_##out_format}
+#define THRESHOLD_CASE_U1(imm, ttype, in_format, out_format) {"_U1_/" #imm "/" #ttype "/" #in_format "/" #out_format, \
+    CT_##imm##_MODE, VX_THRESHOLD_TYPE_##ttype, VX_DF_IMAGE_##in_format, VX_DF_IMAGE_##out_format}
 
 TEST_WITH_ARG(Threshold, testOnRandom, format_arg,
-              THRESHOLD_CASE(Immediate, BINARY, U8),
-              THRESHOLD_CASE(Immediate, BINARY, S16),
-              THRESHOLD_CASE(Immediate, RANGE, U8),
-              THRESHOLD_CASE(Immediate, RANGE, S16),
-              THRESHOLD_CASE(Graph, BINARY, U8),
-              THRESHOLD_CASE(Graph, BINARY, S16),
-              THRESHOLD_CASE(Graph, RANGE, U8),
-              THRESHOLD_CASE(Graph, RANGE, S16),
+              THRESHOLD_CASE(Immediate, BINARY,  U8, U8),
+              THRESHOLD_CASE(Immediate, BINARY, S16, U8),
+              THRESHOLD_CASE(Immediate, RANGE,   U8, U8),
+              THRESHOLD_CASE(Immediate, RANGE,  S16, U8),
+              THRESHOLD_CASE(Graph, BINARY,  U8, U8),
+              THRESHOLD_CASE(Graph, BINARY, S16, U8),
+              THRESHOLD_CASE(Graph, RANGE,   U8, U8),
+              THRESHOLD_CASE(Graph, RANGE,  S16, U8),
+              THRESHOLD_CASE_U1(Immediate, BINARY, U8, U1),
+              THRESHOLD_CASE_U1(Immediate, RANGE,  U8, U1),
+              THRESHOLD_CASE_U1(Graph, BINARY, U8, U1),
+              THRESHOLD_CASE_U1(Graph, RANGE,  U8, U1),
               )
 {
-    int format = arg_->format;
+    int in_format = arg_->in_format;
+    int out_format = arg_->out_format;
     int ttype = arg_->ttype;
     int mode = arg_->mode;
     vx_image src, dst;
@@ -139,10 +243,15 @@
 
         if( ct_check_any_size() )
         {
-            width = ct_roundf(ct_log_rng(&rng, 0, 10));
+            width  = ct_roundf(ct_log_rng(&rng, 0, 10));
             height = ct_roundf(ct_log_rng(&rng, 0, 10));
-            width = CT_MAX(width, 1);
+            width  = CT_MAX(width, 1);
             height = CT_MAX(height, 1);
+
+            if (in_format == VX_DF_IMAGE_U1 || out_format == VX_DF_IMAGE_U1)
+            {
+                width = ((width + 7) / 8) * 8;      // Width must be multiple of 8 for U1 images
+            }
         }
         else
         {
@@ -152,19 +261,19 @@
 
         ct_update_progress(iter, niters);
 
-        ASSERT_NO_FAILURE(src0 = ct_allocate_ct_image_random(width, height, format, &rng, a, b));
+        ASSERT_NO_FAILURE(src0 = ct_allocate_ct_image_random(width, height, in_format, &rng, a, b));
         if( iter % 20 == 0 )
         {
             uint8_t val = (uint8_t)CT_RNG_NEXT_INT(rng, a, b);
             ct_memset(src0->data.y, val, ct_stride_bytes(src0)*src0->height);
         }
-        ASSERT_NO_FAILURE(dst0 = ct_allocate_image(width, height, VX_DF_IMAGE_U8));
+        ASSERT_NO_FAILURE(dst0 = ct_allocate_image(width, height, out_format));
         ASSERT_NO_FAILURE(reference_threshold(src0, dst0, ttype, ta, tb, true_val, false_val));
 
         src = ct_image_to_vx_image(src0, context);
-        dst = vxCreateImage(context, width, height, VX_DF_IMAGE_U8);
+        dst = vxCreateImage(context, width, height, out_format);
         ASSERT_VX_OBJECT(dst, VX_TYPE_IMAGE);
-        vxt = vxCreateThresholdForImage(context,  ttype, format, VX_DF_IMAGE_U8);
+        vxt = vxCreateThresholdForImage(context, ttype, in_format, out_format);
         if( ttype == VX_THRESHOLD_TYPE_BINARY )
         {
               vx_pixel_value_t pa;
@@ -224,53 +333,131 @@
     }
 }
 
-
 typedef struct {
     const char* name;
-    vx_enum src_type;
-    vx_enum dst_type;
-} threshold_create_arg;
+    vx_enum ttype;
+    int in_format;
+    int out_format;
+    vx_uint32 shrink_sz;
+} ValidRegionTest_Arg;
 
-#define THRESHOLD_CREATE(src_type, dst_type) {#src_type "/" #dst_type, VX_DF_IMAGE_##src_type,  VX_DF_IMAGE_##dst_type}
+#define THRESHOLD_REGION_CASE(ttype, in_format, out_format, shrink_sz) { #ttype "/" #in_format "/" #out_format, VX_THRESHOLD_TYPE_##ttype, VX_DF_IMAGE_##in_format, VX_DF_IMAGE_##out_format, shrink_sz}
+#define THRESHOLD_REGION_CASE_U1(ttype, in_format, out_format, shrink_sz) {"_U1_/" #ttype "/" #in_format "/" #out_format, VX_THRESHOLD_TYPE_##ttype, VX_DF_IMAGE_##in_format, VX_DF_IMAGE_##out_format, shrink_sz}
 
-TEST_WITH_ARG(Threshold, testThresholdCreation, threshold_create_arg,
-              THRESHOLD_CREATE(U8, U8),
-              THRESHOLD_CREATE(S16, U8),
+TEST_WITH_ARG(Threshold, testWithValidRegion, ValidRegionTest_Arg,
+              THRESHOLD_REGION_CASE(BINARY,  U8, U8, 1),
+              THRESHOLD_REGION_CASE(BINARY, S16, U8, 1),
+              THRESHOLD_REGION_CASE(RANGE,   U8, U8, 1),
+              THRESHOLD_REGION_CASE(RANGE,  S16, U8, 1),
+              THRESHOLD_REGION_CASE(BINARY,  U8, U8, 7),
+              THRESHOLD_REGION_CASE(BINARY, S16, U8, 7),
+              THRESHOLD_REGION_CASE(RANGE,   U8, U8, 7),
+              THRESHOLD_REGION_CASE(RANGE,  S16, U8, 7),
+              THRESHOLD_REGION_CASE_U1(BINARY, U8, U1, 1),
+              THRESHOLD_REGION_CASE_U1(RANGE,  U8, U1, 1),
+              THRESHOLD_REGION_CASE_U1(BINARY, U8, U1, 7),
+              THRESHOLD_REGION_CASE_U1(RANGE,  U8, U1, 7),
               )
 {
+    int in_format = arg_->in_format;
+    int out_format = arg_->out_format;
+    int ttype = arg_->ttype;
+    vx_image src, dst;
+    vx_threshold vxt;
+    CT_Image src0, dst0, dst1;
     vx_context context = context_->vx_context_;
-    vx_enum thresh_type = VX_THRESHOLD_TYPE_BINARY;
+    int iter, niters = 100;
+    uint64_t rng;
+    int a = 0, b = 256;
+    int true_val = CT_THRESHOLD_TRUE_VALUE;
+    int false_val = CT_THRESHOLD_FALSE_VALUE;
+    vx_uint32 region_shrink = arg_->shrink_sz;
+    vx_rectangle_t rect;
 
-    vx_threshold threshold;
-    ASSERT_VX_OBJECT(threshold = vxCreateThresholdForImage(context, thresh_type, arg_->src_type, arg_->dst_type), VX_TYPE_THRESHOLD);
+    rng = CT()->seed_;
 
-    vx_df_image input_type, output_type;
-    vxQueryThreshold(threshold,  VX_THRESHOLD_INPUT_FORMAT, &input_type, sizeof(vx_df_image));
-    vxQueryThreshold(threshold,  VX_THRESHOLD_OUTPUT_FORMAT, &output_type, sizeof(vx_df_image));
-    ASSERT_EQ_INT(arg_->src_type, input_type);
-    ASSERT_EQ_INT(arg_->dst_type, output_type);
+    for( iter = 0; iter < niters; iter++ )
+    {
+        int width, height;
 
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseThreshold(&threshold));
-}
+        uint8_t _ta = CT_RNG_NEXT_INT(rng, 0, 256), _tb = CT_RNG_NEXT_INT(rng, 0, 256);
+        vx_int32 ta = CT_MIN(_ta, _tb), tb = CT_MAX(_ta, _tb);
 
-TEST_WITH_ARG(Threshold, testVirtualThresholdCreation, threshold_create_arg,
-              THRESHOLD_CREATE(U8, U8),
-              THRESHOLD_CREATE(S16, U8),
-              )
-{
-    vx_context context = context_->vx_context_;
-    vx_enum thresh_type = VX_THRESHOLD_TYPE_BINARY;
-    vx_graph graph = vxCreateGraph(context);
+        if( ct_check_any_size() )
+        {
+            width  = ct_roundf(ct_log_rng(&rng, 0, 10));
+            height = ct_roundf(ct_log_rng(&rng, 0, 10));
+            width  = CT_MAX(width, 15);             // Max region shrink is 7 on each side -> minimum size is 15
+            height = CT_MAX(height, 15);
 
-    vx_threshold threshold;
-    ASSERT_VX_OBJECT(threshold = vxCreateVirtualThresholdForImage(graph, thresh_type, arg_->src_type, arg_->dst_type), VX_TYPE_THRESHOLD);
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseThreshold(&threshold));
+            if (in_format == VX_DF_IMAGE_U1 || out_format == VX_DF_IMAGE_U1)
+            {
+                width = ((width + 7) / 8) * 8;      // Width must be multiple of 8 for U1 images
+            }
+        }
+        else
+        {
+            width = 640;
+            height = 480;
+        }
 
-    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseGraph(&graph));
+        ct_update_progress(iter, niters);
+
+        ASSERT_NO_FAILURE(src0 = ct_allocate_ct_image_random(width, height, in_format, &rng, a, b));
+        if( iter % 20 == 0 )
+        {
+            uint8_t val = (uint8_t)CT_RNG_NEXT_INT(rng, a, b);
+            ct_memset(src0->data.y, val, ct_stride_bytes(src0)*src0->height);
+        }
+
+        ASSERT_VX_OBJECT(src = ct_image_to_vx_image(src0, context), VX_TYPE_IMAGE);
+        ASSERT_VX_OBJECT(dst = vxCreateImage(context, width, height, out_format), VX_TYPE_IMAGE);
+        vxt = vxCreateThresholdForImage(context, ttype, in_format, out_format);
+        if( ttype == VX_THRESHOLD_TYPE_BINARY )
+        {
+            vx_pixel_value_t pa;
+            pa.S32 = ta;
+            ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxCopyThresholdValue(vxt, &pa, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+        else
+        {
+            vx_pixel_value_t pa, pb;
+            pa.S32 = ta;
+            pb.S32 = tb;
+            ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxCopyThresholdRange(vxt, &pa, &pb, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+        }
+
+        vx_pixel_value_t ptrue, pfalse;
+        ptrue.S32 = true_val;
+        pfalse.S32 = false_val;
+        ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxCopyThresholdOutput(vxt, &ptrue, &pfalse, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+        ASSERT_NO_FAILURE(vxGetValidRegionImage(src, &rect));
+        ALTERRECTANGLE(rect, region_shrink, region_shrink, -region_shrink, -region_shrink);
+        ASSERT_NO_FAILURE(vxSetImageValidRectangle(src, &rect));
+
+        ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxuThreshold(context, src, vxt, dst));
+
+        ASSERT_NO_FAILURE(ct_adjust_roi(src0, region_shrink, region_shrink, region_shrink, region_shrink));
+        ASSERT_NO_FAILURE(dst0 = ct_allocate_image(src0->width, src0->height, out_format));
+        ASSERT_NO_FAILURE(reference_threshold(src0, dst0, ttype, ta, tb, true_val, false_val));
+
+        ASSERT_NO_FAILURE(dst1 = ct_image_from_vx_image(dst));
+        ASSERT_NO_FAILURE(ct_adjust_roi(dst1, region_shrink, region_shrink, region_shrink, region_shrink));
+
+        ASSERT_CTIMAGE_NEAR(dst0, dst1, 0);
+        VX_CALL(vxReleaseImage(&src));
+        VX_CALL(vxReleaseImage(&dst));
+        VX_CALL(vxReleaseThreshold(&vxt));
+        CT_CollectGarbage(CT_GC_IMAGE);
+    }
 }
 
 TESTCASE_TESTS(Threshold,
                testThresholdCreation,
                testVirtualThresholdCreation,
-               testOnRandom
+               testOnRandom,
+               testWithValidRegion
                )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_user_data_object.c b/test_conformance/test_user_data_object.c
new file mode 100644
index 0000000..5797cdd
--- /dev/null
+++ b/test_conformance/test_user_data_object.c
@@ -0,0 +1,817 @@
+/*
+
+ * Copyright (c) 2012-2018 The Khronos Group Inc.
+ *
+ * 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.
+ */
+
+#ifdef OPENVX_USE_USER_DATA_OBJECT
+
+#include "test_engine/test.h"
+#include <VX/vx.h>
+#include <VX/vxu.h>
+#include <VX/vx_khr_user_data_object.h>
+
+#define VX_KERNEL_CONFORMANCE_TEST_OWN_BAD (VX_KERNEL_BASE(VX_ID_DEFAULT, 0) + 0)
+#define VX_KERNEL_CONFORMANCE_TEST_OWN_BAD_NAME "org.khronos.openvx.test.own_bad"
+
+#define VX_KERNEL_CONFORMANCE_TEST_OWN (VX_KERNEL_BASE(VX_ID_DEFAULT, 0) + 1)
+#define VX_KERNEL_CONFORMANCE_TEST_OWN_NAME "org.khronos.openvx.test.own"
+
+#define VX_KERNEL_CONFORMANCE_TEST_OWN_USER (VX_KERNEL_BASE(VX_ID_DEFAULT, 0) + 2)
+#define VX_KERNEL_CONFORMANCE_TEST_OWN_USER_NAME "org.khronos.openvx.test.own_user"
+
+TESTCASE(UserDataObject, CT_VXContext, ct_setup_vx_context, 0)
+
+typedef enum _own_params_e
+{
+    OWN_PARAM_INPUT = 0,
+    OWN_PARAM_OUTPUT,
+} own_params_e;
+
+static enum vx_type_e type = VX_TYPE_INVALID;
+static enum vx_type_e objarray_itemtype = VX_TYPE_INVALID;
+
+static vx_size local_size = 0;
+static vx_bool is_kernel_alloc = vx_false_e;
+static vx_size local_size_auto_alloc = 0;
+static vx_size local_size_kernel_alloc = 0;
+
+static vx_status set_local_size_status_init = VX_SUCCESS;
+static vx_status set_local_ptr_status_init = VX_SUCCESS;
+
+static vx_status query_local_size_status_deinit = VX_SUCCESS;
+static vx_status query_local_ptr_status_deinit = VX_SUCCESS;
+static vx_status set_local_size_status_deinit = VX_SUCCESS;
+static vx_status set_local_ptr_status_deinit = VX_SUCCESS;
+
+static const vx_char user_data_object_name[] = "wb_t";
+
+typedef struct
+{
+    vx_int32 mode;
+    vx_int32 gain[4];
+    vx_int32 offset[4];
+} wb_t;
+
+static vx_bool is_validator_called = vx_false_e;
+static vx_status VX_CALLBACK own_ValidatorMetaFromRef(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
+{
+    is_validator_called = vx_true_e;
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+
+    vx_reference input = parameters[OWN_PARAM_INPUT];
+    ASSERT_VX_OBJECT_(return VX_FAILURE, input, type);
+    vx_reference output = parameters[OWN_PARAM_OUTPUT];
+    ASSERT_VX_OBJECT_(return VX_FAILURE, output, type);
+
+    vx_meta_format meta = metas[OWN_PARAM_OUTPUT];
+
+    vx_enum in_ref_type = VX_TYPE_INVALID;
+    VX_CALL_(return VX_ERROR_INVALID_PARAMETERS, vxQueryReference(input, VX_REFERENCE_TYPE, &in_ref_type, sizeof(vx_enum)));
+    vx_enum out_ref_type = VX_TYPE_INVALID;
+    VX_CALL_(return VX_ERROR_INVALID_PARAMETERS, vxQueryReference(output, VX_REFERENCE_TYPE, &out_ref_type, sizeof(vx_enum)));
+
+    if (in_ref_type == out_ref_type)
+    {
+        vx_enum item_type = (type == VX_TYPE_OBJECT_ARRAY) ? objarray_itemtype : VX_TYPE_UINT8;
+        vx_size capacity = 20;
+
+        vx_enum actual_item_type = VX_TYPE_INVALID;
+        vx_size actual_capacity = 0;
+        switch (type)
+        {
+        case VX_TYPE_OBJECT_ARRAY:
+            VX_CALL_(return VX_FAILURE, vxQueryObjectArray((vx_object_array)input, VX_OBJECT_ARRAY_ITEMTYPE, &actual_item_type, sizeof(vx_enum)));
+            VX_CALL_(return VX_FAILURE, vxQueryObjectArray((vx_object_array)input, VX_OBJECT_ARRAY_NUMITEMS, &actual_capacity, sizeof(vx_size)));
+
+            if (actual_item_type == item_type && actual_capacity == capacity)
+            {
+                VX_CALL_(return VX_FAILURE, vxSetMetaFormatFromReference(meta, input));
+            }
+            else
+            {
+                return VX_ERROR_INVALID_PARAMETERS;
+            }
+            break;
+        case VX_TYPE_USER_DATA_OBJECT:
+            {
+                char actual_name[VX_REFERENCE_NAME];
+                vx_size actual_size;
+
+                VX_CALL_(return VX_FAILURE, vxQueryUserDataObject((vx_user_data_object)input, VX_USER_DATA_OBJECT_NAME, &actual_name, sizeof(actual_name)));
+                VX_CALL_(return VX_FAILURE, vxQueryUserDataObject((vx_user_data_object)input, VX_USER_DATA_OBJECT_SIZE, &actual_size, sizeof(vx_size)));
+
+                if ((strcmp(user_data_object_name, actual_name) == 0) && (actual_size == sizeof(wb_t)))
+                {
+                    VX_CALL_(return VX_FAILURE, vxSetMetaFormatFromReference(meta, input));
+                }
+                else
+                {
+                    return VX_ERROR_INVALID_PARAMETERS;
+                }
+            }
+            break;
+        default:
+            return VX_ERROR_INVALID_PARAMETERS;
+            break;
+        }
+
+    }
+
+    return VX_SUCCESS;
+}
+
+static vx_status VX_CALLBACK own_ValidatorMetaFromAttr(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[])
+{
+    is_validator_called = vx_true_e;
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+
+    vx_reference input = parameters[OWN_PARAM_INPUT];
+
+    vx_meta_format meta = metas[OWN_PARAM_OUTPUT];
+
+    vx_enum item_type = (type == VX_TYPE_OBJECT_ARRAY) ? objarray_itemtype : VX_TYPE_UINT8;
+    vx_size capacity = 20;
+
+    vx_enum actual_item_type = VX_TYPE_INVALID;
+    vx_size actual_capacity = 0;
+    switch (type)
+    {
+
+    case VX_TYPE_OBJECT_ARRAY:
+        VX_CALL_(return VX_FAILURE, vxQueryObjectArray((vx_object_array)input, VX_OBJECT_ARRAY_ITEMTYPE, &actual_item_type, sizeof(vx_enum)));
+        VX_CALL_(return VX_FAILURE, vxQueryObjectArray((vx_object_array)input, VX_OBJECT_ARRAY_NUMITEMS, &actual_capacity, sizeof(vx_size)));
+
+        if (actual_item_type == item_type && actual_capacity == capacity)
+        {
+            VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(meta, VX_OBJECT_ARRAY_ITEMTYPE, &item_type, sizeof(vx_enum)));
+            VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(meta, VX_OBJECT_ARRAY_NUMITEMS, &capacity, sizeof(vx_size)));
+        }
+        else
+        {
+            return VX_ERROR_INVALID_PARAMETERS;
+        }
+        break;
+    case VX_TYPE_USER_DATA_OBJECT:
+        {
+            vx_size actual_size;
+            vx_size user_data_size = sizeof(wb_t);
+            char actual_name[VX_REFERENCE_NAME];
+
+            VX_CALL_(return VX_FAILURE, vxQueryUserDataObject((vx_user_data_object)input, VX_USER_DATA_OBJECT_NAME, &actual_name, sizeof(actual_name)));
+            VX_CALL_(return VX_FAILURE, vxQueryUserDataObject((vx_user_data_object)input, VX_USER_DATA_OBJECT_SIZE, &actual_size, sizeof(vx_size)));
+
+            if ((strcmp(user_data_object_name, actual_name) == 0) && (actual_size == sizeof(wb_t)))
+            {
+                VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(meta, VX_USER_DATA_OBJECT_NAME, &user_data_object_name, sizeof(user_data_object_name)));
+                VX_CALL_(return VX_FAILURE, vxSetMetaFormatAttribute(meta, VX_USER_DATA_OBJECT_SIZE, &user_data_size, sizeof(vx_size)));
+            }
+            else
+            {
+                return VX_ERROR_INVALID_PARAMETERS;
+            }
+        }
+        break;
+    default:
+        return VX_ERROR_INVALID_PARAMETERS;
+        break;
+    }
+
+    return VX_SUCCESS;
+}
+
+static vx_bool is_kernel_called = vx_false_e;
+static vx_status VX_CALLBACK own_Kernel(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    is_kernel_called = vx_true_e;
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+    EXPECT(parameters != NULL);
+    EXPECT(num == 2);
+    if (parameters != NULL && num == 2)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+        EXPECT_VX_OBJECT(parameters[1], type);
+    }
+
+    return VX_SUCCESS;
+}
+
+static vx_bool is_initialize_called = vx_false_e;
+static vx_status VX_CALLBACK own_Initialize(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    vx_size size = 0;
+    void* ptr = NULL;
+    is_initialize_called = vx_true_e;
+    ASSERT_VX_OBJECT_(return VX_FAILURE, node, VX_TYPE_NODE);
+    EXPECT(parameters != NULL);
+    EXPECT(num == 2);
+    if (parameters != NULL && num == 2)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+        EXPECT_VX_OBJECT(parameters[1], type);
+    }
+    if (local_size_kernel_alloc > 0)
+    {
+        size = local_size_kernel_alloc;
+        ptr = ct_calloc(1, local_size_kernel_alloc);
+    }
+    set_local_size_status_init = vxSetNodeAttribute(node, VX_NODE_LOCAL_DATA_SIZE, &size, sizeof(size));
+    set_local_ptr_status_init = vxSetNodeAttribute(node, VX_NODE_LOCAL_DATA_PTR, &ptr, sizeof(ptr));
+    return VX_SUCCESS;
+}
+
+static vx_bool is_deinitialize_called = vx_false_e;
+static vx_status VX_CALLBACK own_Deinitialize(vx_node node, const vx_reference *parameters, vx_uint32 num)
+{
+    vx_size size = 0;
+    void* ptr = NULL;
+    is_deinitialize_called = vx_true_e;
+    EXPECT(node != 0);
+    EXPECT(parameters != NULL);
+    EXPECT(num == 2);
+    if (parameters != NULL && num == 2)
+    {
+        EXPECT_VX_OBJECT(parameters[0], type);
+        EXPECT_VX_OBJECT(parameters[1], type);
+    }
+    query_local_size_status_deinit = vxQueryNode(node, VX_NODE_LOCAL_DATA_SIZE, &size, sizeof(size));
+    query_local_ptr_status_deinit = vxQueryNode(node, VX_NODE_LOCAL_DATA_PTR, &ptr, sizeof(ptr));
+    if (local_size_kernel_alloc > 0)
+    {
+        size = 0;
+        if (ptr != NULL)
+        {
+            ct_free_mem(ptr);
+            ptr = NULL;
+        }
+    }
+    set_local_size_status_deinit = vxSetNodeAttribute(node, VX_NODE_LOCAL_DATA_SIZE, &size, sizeof(size));
+    set_local_ptr_status_deinit = vxSetNodeAttribute(node, VX_NODE_LOCAL_DATA_PTR, &ptr, sizeof(ptr));
+    return VX_SUCCESS;
+}
+
+static void own_register_kernel(vx_context context, vx_bool is_meta_from_ref)
+{
+    vx_kernel kernel = 0;
+    vx_size size = local_size_auto_alloc;
+
+    if (is_meta_from_ref)
+    {
+        ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_KERNEL_CONFORMANCE_TEST_OWN_USER_NAME,
+            VX_KERNEL_CONFORMANCE_TEST_OWN_USER,
+            own_Kernel,
+            2,
+            own_ValidatorMetaFromRef,
+            own_Initialize,
+            own_Deinitialize), VX_TYPE_KERNEL);
+    }
+    else
+    {
+        ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_KERNEL_CONFORMANCE_TEST_OWN_USER_NAME,
+            VX_KERNEL_CONFORMANCE_TEST_OWN_USER,
+            own_Kernel,
+            2,
+            own_ValidatorMetaFromAttr,
+            own_Initialize,
+            own_Deinitialize), VX_TYPE_KERNEL);
+    }
+
+    VX_CALL(vxAddParameterToKernel(kernel, OWN_PARAM_INPUT, VX_INPUT, type, VX_PARAMETER_STATE_REQUIRED));
+    {
+        vx_parameter parameter = 0;
+        vx_enum direction = 0;
+        ASSERT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, OWN_PARAM_INPUT), VX_TYPE_PARAMETER);
+        VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_DIRECTION, &direction, sizeof(direction)));
+        ASSERT(direction == VX_INPUT);
+        VX_CALL(vxReleaseParameter(&parameter));
+    }
+    VX_CALL(vxAddParameterToKernel(kernel, OWN_PARAM_OUTPUT, VX_OUTPUT, type, VX_PARAMETER_STATE_REQUIRED));
+    {
+        vx_parameter parameter = 0;
+        vx_enum direction = 0;
+        ASSERT_VX_OBJECT(parameter = vxGetKernelParameterByIndex(kernel, OWN_PARAM_OUTPUT), VX_TYPE_PARAMETER);
+        VX_CALL(vxQueryParameter(parameter, VX_PARAMETER_DIRECTION, &direction, sizeof(direction)));
+        ASSERT(direction == VX_OUTPUT);
+        VX_CALL(vxReleaseParameter(&parameter));
+    }
+    VX_CALL(vxSetKernelAttribute(kernel, VX_KERNEL_LOCAL_DATA_SIZE, &size, sizeof(size)));
+    VX_CALL(vxFinalizeKernel(kernel));
+    VX_CALL(vxReleaseKernel(&kernel));
+}
+
+typedef struct {
+    const char* name;
+    vx_enum type;
+    vx_bool is_meta_from_ref;
+    vx_size local_size;
+    vx_bool is_kernel_alloc;
+} type_arg;
+
+#define ADD_TYPE(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "USER_DATA_OBJECT", __VA_ARGS__, VX_TYPE_USER_DATA_OBJECT)) \
+
+#define ADD_FROM_FLAG(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "_FROM_REF", __VA_ARGS__, vx_true_e)), \
+    CT_EXPAND(nextmacro(testArgName "_FROM_ATTR", __VA_ARGS__, vx_false_e))
+
+#define ADD_LOCAL_SIZE_AND_ALLOC(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/LOCAL_SIZE=0", __VA_ARGS__, 0, vx_false_e)), \
+    CT_EXPAND(nextmacro(testArgName "/LOCAL_SIZE=10/ALLOC=AUTO", __VA_ARGS__, 10, vx_false_e)), \
+    CT_EXPAND(nextmacro(testArgName "/LOCAL_SIZE=10/ALLOC=KERNEL", __VA_ARGS__, 10, vx_true_e))
+
+#define USERKERNEL_PARAMETERS \
+    CT_GENERATE_PARAMETERS("", ADD_TYPE, ADD_FROM_FLAG, ADD_LOCAL_SIZE_AND_ALLOC, ARG)
+
+TEST_WITH_ARG(UserDataObject, testUserKernel, type_arg, USERKERNEL_PARAMETERS)
+{
+    vx_context context = context_->vx_context_;
+    vx_reference src = 0, dst = 0;
+    vx_graph graph = 0;
+    vx_kernel user_kernel = 0;
+    vx_node node = 0;
+    vx_bool is_meta_from_ref = arg_->is_meta_from_ref;
+
+    int phase = 0;
+
+    type = (enum vx_type_e)arg_->type;
+    local_size = arg_->local_size;
+    is_kernel_alloc = arg_->is_kernel_alloc;
+
+    if (is_kernel_alloc == vx_false_e)
+    {
+        local_size_auto_alloc = local_size;
+        local_size_kernel_alloc = 0;
+    }
+    else
+    {
+        local_size_auto_alloc = 0;
+        local_size_kernel_alloc = local_size;
+    }
+
+    is_validator_called = vx_false_e;
+    is_kernel_called = vx_false_e;
+    is_initialize_called = vx_false_e;
+    is_deinitialize_called = vx_false_e;
+
+    switch (type)
+    {
+
+    case VX_TYPE_USER_DATA_OBJECT:
+        {
+            ASSERT_VX_OBJECT(src = (vx_reference)vxCreateUserDataObject(context, (const vx_char*)&user_data_object_name, sizeof(wb_t), NULL), type);
+            ASSERT_VX_OBJECT(dst = (vx_reference)vxCreateUserDataObject(context, (const vx_char*)&user_data_object_name, sizeof(wb_t), NULL), type);
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    ASSERT_NO_FAILURE(own_register_kernel(context, is_meta_from_ref));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    ASSERT_VX_OBJECT(user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_OWN_USER_NAME), VX_TYPE_KERNEL);
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, user_kernel), VX_TYPE_NODE);
+
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)src));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)dst));
+
+    // graph verification, first-time, and re-verify
+
+    for (phase = 0; phase < 2; ++phase)
+    {
+        vx_size size = 0;
+        void* ptr = NULL;
+
+        is_initialize_called = vx_false_e;
+        is_deinitialize_called = vx_false_e;
+        is_validator_called = vx_false_e;
+        set_local_size_status_init = VX_FAILURE;
+        set_local_ptr_status_init = VX_FAILURE;
+        query_local_size_status_deinit = VX_FAILURE;
+        query_local_ptr_status_deinit = VX_FAILURE;
+        set_local_size_status_deinit = VX_FAILURE;
+        set_local_ptr_status_deinit = VX_FAILURE;
+
+        VX_CALL(vxVerifyGraph(graph));
+
+        ASSERT(is_initialize_called == vx_true_e);
+        if (phase == 0)
+            ASSERT(is_deinitialize_called == vx_false_e);
+        else
+            ASSERT(is_deinitialize_called == vx_true_e);
+        ASSERT(is_validator_called == vx_true_e);
+
+        VX_CALL(vxQueryNode(node, VX_NODE_LOCAL_DATA_SIZE, &size, sizeof(size)));
+        VX_CALL(vxQueryNode(node, VX_NODE_LOCAL_DATA_PTR, &ptr, sizeof(ptr)));
+
+        ASSERT(VX_SUCCESS != vxSetNodeAttribute(node, VX_NODE_LOCAL_DATA_SIZE, &size, sizeof(size)));
+        ASSERT(VX_SUCCESS != vxSetNodeAttribute(node, VX_NODE_LOCAL_DATA_PTR, &ptr, sizeof(ptr)));
+
+        ASSERT(size == local_size);
+        if (size > 0)
+            ASSERT(ptr != NULL);
+        else
+            ASSERT(ptr == NULL);
+
+        if (local_size_auto_alloc == 0) // change allowed
+        {
+            ASSERT(set_local_size_status_init == VX_SUCCESS);
+            ASSERT(set_local_ptr_status_init == VX_SUCCESS);
+            if (is_deinitialize_called)
+            {
+                ASSERT(set_local_size_status_deinit == VX_SUCCESS);
+                ASSERT(set_local_ptr_status_deinit == VX_SUCCESS);
+            }
+        }
+        else // change does not allowed: error must be generated
+        {
+            ASSERT(set_local_size_status_init != VX_SUCCESS);
+            ASSERT(set_local_ptr_status_init != VX_SUCCESS);
+            if (is_deinitialize_called)
+            {
+                ASSERT(set_local_size_status_deinit != VX_SUCCESS);
+                ASSERT(set_local_ptr_status_deinit != VX_SUCCESS);
+            }
+        }
+    }
+
+    // execute graph
+
+    is_initialize_called = vx_false_e;
+    is_deinitialize_called = vx_false_e;
+    is_validator_called = vx_false_e;
+    is_kernel_called = vx_false_e;
+
+    VX_CALL(vxProcessGraph(graph));
+
+    ASSERT(is_initialize_called == vx_false_e);
+    ASSERT(is_deinitialize_called == vx_false_e);
+    ASSERT(is_validator_called == vx_false_e);
+    ASSERT(is_kernel_called == vx_true_e);
+
+    // finalization
+
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    /* user kernel should be removed only after all references to it released */
+    /* Note, vxRemoveKernel doesn't zeroing kernel ref */
+    VX_CALL(vxRemoveKernel(user_kernel));
+
+    VX_CALL(vxReleaseReference(&dst));
+    VX_CALL(vxReleaseReference(&src));
+
+    ASSERT(node == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst == 0);
+    ASSERT(src == 0);
+}
+
+TEST_WITH_ARG(UserDataObject, testUserKernelObjectArray, type_arg,
+    ARG("USER_DATA_OBJECT_FROM_REF", VX_TYPE_USER_DATA_OBJECT, vx_true_e),
+    ARG("USER_DATA_OBJECT_FROM_ATTR",VX_TYPE_USER_DATA_OBJECT, vx_false_e)
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_reference exemplar = 0, src = 0, dst = 0;
+    vx_graph graph = 0;
+    vx_kernel user_kernel = 0;
+    vx_node node = 0;
+    vx_bool is_meta_from_ref = arg_->is_meta_from_ref;
+    objarray_itemtype = (enum vx_type_e)arg_->type;
+    type = VX_TYPE_OBJECT_ARRAY;
+
+    is_validator_called = vx_false_e;
+    is_kernel_called = vx_false_e;
+    is_initialize_called = vx_false_e;
+    is_deinitialize_called = vx_false_e;
+
+    vx_size capacity = 20;
+
+    switch (objarray_itemtype)
+    {
+    case VX_TYPE_USER_DATA_OBJECT:
+        ASSERT_VX_OBJECT(exemplar = (vx_reference)vxCreateUserDataObject(context, (const vx_char*)&user_data_object_name, sizeof(wb_t), NULL), objarray_itemtype);
+        break;
+    default:
+        break;
+    }
+
+    ASSERT_VX_OBJECT(src = (vx_reference)vxCreateObjectArray(context, exemplar, capacity), VX_TYPE_OBJECT_ARRAY);
+    ASSERT_VX_OBJECT(dst = (vx_reference)vxCreateObjectArray(context, exemplar, capacity), VX_TYPE_OBJECT_ARRAY);
+
+    ASSERT_NO_FAILURE(own_register_kernel(context, is_meta_from_ref));
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+
+    ASSERT_VX_OBJECT(user_kernel = vxGetKernelByName(context, VX_KERNEL_CONFORMANCE_TEST_OWN_USER_NAME), VX_TYPE_KERNEL);
+    ASSERT_VX_OBJECT(node = vxCreateGenericNode(graph, user_kernel), VX_TYPE_NODE);
+
+    VX_CALL(vxSetParameterByIndex(node, 0, (vx_reference)src));
+    VX_CALL(vxSetParameterByIndex(node, 1, (vx_reference)dst));
+
+    VX_CALL(vxVerifyGraph(graph));
+    VX_CALL(vxProcessGraph(graph));
+
+    VX_CALL(vxReleaseNode(&node));
+    VX_CALL(vxReleaseGraph(&graph));
+    /* user kernel should be removed only after all references to it released */
+    /* Note, vxRemoveKernel doesn't zeroing kernel ref */
+    VX_CALL(vxRemoveKernel(user_kernel));
+
+    VX_CALL(vxReleaseReference(&dst));
+    VX_CALL(vxReleaseReference(&src));
+    VX_CALL(vxReleaseReference(&exemplar));
+
+    ASSERT(node == 0);
+    ASSERT(graph == 0);
+    ASSERT(dst == 0);
+    ASSERT(src == 0);
+    ASSERT(exemplar == 0);
+
+    ASSERT(is_validator_called == vx_true_e);
+    ASSERT(is_kernel_called == vx_true_e);
+    ASSERT(is_initialize_called == vx_true_e);
+    ASSERT(is_deinitialize_called == vx_true_e);
+}
+
+TEST(UserDataObject, testRemoveKernel)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+
+    EXPECT_VX_OBJECT(kernel = vxGetKernelByEnum(context, VX_KERNEL_ADD), VX_TYPE_KERNEL);
+    // Only kernels added through vxAddUserKernel can be removed
+    ASSERT_EQ_VX_STATUS(VX_ERROR_INVALID_PARAMETERS, vxRemoveKernel(kernel));
+    VX_CALL(vxReleaseKernel(&kernel));
+
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+            context,
+            VX_KERNEL_CONFORMANCE_TEST_OWN_BAD_NAME,
+            VX_KERNEL_CONFORMANCE_TEST_OWN_BAD,
+            own_Kernel,
+            2,
+            own_ValidatorMetaFromRef,
+            own_Initialize,
+            own_Deinitialize), VX_TYPE_KERNEL);
+
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+TEST(UserDataObject, testOutDelay)
+{
+    vx_context context = context_->vx_context_;
+    vx_kernel kernel = 0;
+
+    ASSERT_VX_OBJECT(kernel = vxAddUserKernel(
+        context,
+        VX_KERNEL_CONFORMANCE_TEST_OWN_BAD_NAME,
+        VX_KERNEL_CONFORMANCE_TEST_OWN_BAD,
+        own_Kernel,
+        2,
+        own_ValidatorMetaFromRef,
+        own_Initialize,
+        own_Deinitialize), VX_TYPE_KERNEL);
+
+    ASSERT_NE_VX_STATUS(vxAddParameterToKernel(kernel, 0, VX_OUTPUT, VX_TYPE_DELAY, VX_PARAMETER_STATE_REQUIRED), VX_SUCCESS);
+
+    VX_CALL(vxRemoveKernel(kernel));
+}
+
+
+
+TEST(UserDataObject, test_vxCreateUserDataObject)
+{
+    vx_context context = context_->vx_context_;
+    char actual_name[VX_REFERENCE_NAME];
+    vx_size actual_size = 0;
+    vx_user_data_object user_data_object = 0;
+
+    /* 1. check if user data object can be created with empty type_name and not initialized */
+    ASSERT_VX_OBJECT(user_data_object = vxCreateUserDataObject(context, NULL, sizeof(wb_t), NULL), VX_TYPE_USER_DATA_OBJECT);
+
+    /* 2. check if user data object actual name is a string with a null termination */
+    VX_CALL(vxQueryUserDataObject(user_data_object, VX_USER_DATA_OBJECT_NAME, &actual_name, sizeof(actual_name)));
+    ASSERT(strncmp("", actual_name, VX_REFERENCE_NAME) == 0);
+
+    /* 3. check if user data object actual size corresponds to requested size */
+    VX_CALL(vxQueryUserDataObject(user_data_object, VX_USER_DATA_OBJECT_SIZE, &actual_size, sizeof(vx_size)));
+    ASSERT_EQ_INT(sizeof(wb_t), actual_size);
+
+    /* 4. Initialize empty user data object after creation */
+	{
+		wb_t *p = NULL;
+        vx_map_id map_id;
+        vx_int32 i;
+
+		/* Initialize data using WRITE ONLY MAP */
+        VX_CALL(vxMapUserDataObject(user_data_object, 0, sizeof(wb_t), &map_id, (void **)&p, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
+        ASSERT(p != NULL);
+		p->mode = 2;
+		for (i = 0; i < 4; i++)
+		{
+			p->gain[i] = i;
+			p->offset[i] = i+4;
+		}
+        VX_CALL(vxUnmapUserDataObject(user_data_object, map_id));
+
+    /* 5. check data in user data object */
+
+        VX_CALL(vxMapUserDataObject(user_data_object, 0, sizeof(wb_t), &map_id, (void **)&p, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0));
+		ASSERT(2 == p->mode);
+		for (i = 0; i < 4; i++)
+		{
+			ASSERT(p->gain[i] == i);
+			ASSERT(p->offset[i] == i+4);
+		}
+        VX_CALL(vxUnmapUserDataObject(user_data_object, map_id));
+	}
+
+    VX_CALL(vxReleaseUserDataObject(&user_data_object));
+    ASSERT(user_data_object == 0);
+}
+
+TEST(UserDataObject, test_vxCopyUserDataObjectWrite)
+{
+    vx_context context = context_->vx_context_;
+    wb_t localUserDataObjectInit;
+    wb_t localUserDataObject;
+    vx_user_data_object user_data_object;
+    int i;
+
+    /* Initialization */
+    localUserDataObjectInit.mode = 0;
+    localUserDataObject.mode = 1;
+
+    for (i = 0; i < 4; i++)
+    {
+        localUserDataObjectInit.gain[i] = 0;
+        localUserDataObjectInit.offset[i] = 0;
+
+        localUserDataObject.gain[i] = i;
+        localUserDataObject.offset[i] = i+4;
+    }
+
+    ASSERT_VX_OBJECT(user_data_object = vxCreateUserDataObject(context, user_data_object_name, sizeof(wb_t), &localUserDataObjectInit), VX_TYPE_USER_DATA_OBJECT);
+
+    /* Write, COPY gains */
+    {
+        vx_size local_offset = offsetof(wb_t, gain);
+        vx_size local_bytes = sizeof(vx_int32)*4;
+        vx_int32 *p = &localUserDataObject.gain[0];
+        VX_CALL(vxCopyUserDataObject(user_data_object, local_offset, local_bytes, (void *)p, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+    }
+
+    /* Check (MAP) */
+    {
+        vx_int32 *p = NULL;
+        vx_size local_offset = offsetof(wb_t, gain);
+        vx_size local_bytes = sizeof(vx_int32)*4;
+        vx_map_id map_id;
+        VX_CALL(vxMapUserDataObject(user_data_object, local_offset, local_bytes, &map_id, (void **)&p, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X));
+
+        ASSERT(p != NULL);
+        for (i = 0; i<4; i++)
+        {
+            ASSERT(p[i] == i);
+        }
+
+        VX_CALL(vxUnmapUserDataObject(user_data_object, map_id));
+    }
+
+    VX_CALL(vxReleaseUserDataObject(&user_data_object));
+    ASSERT(user_data_object == 0);
+}
+
+TEST(UserDataObject, test_vxCopyUserDataObjectRead)
+{
+    vx_context context = context_->vx_context_;
+    wb_t localUserDataObjectInit;
+    wb_t localUserDataObject;
+    vx_user_data_object user_data_object;
+    int i;
+
+    /* Initialization */
+    localUserDataObjectInit.mode = 1;
+    localUserDataObject.mode =0;
+
+    for (i = 0; i < 4; i++)
+    {
+        localUserDataObjectInit.gain[i] = i;
+        localUserDataObjectInit.offset[i] = i+4;
+
+        localUserDataObject.gain[i] = 0;
+        localUserDataObject.offset[i] = 0;
+    }
+
+    ASSERT_VX_OBJECT(user_data_object = vxCreateUserDataObject(context, user_data_object_name, sizeof(wb_t), &localUserDataObjectInit), VX_TYPE_USER_DATA_OBJECT);
+
+    /* READ, COPY offsets */
+    {
+        vx_size local_offset = offsetof(wb_t, offset);
+        vx_size local_bytes = sizeof(vx_int32)*4;
+        vx_int32 *p = &localUserDataObject.offset[0];
+        VX_CALL(vxCopyUserDataObject(user_data_object, local_offset, local_bytes, (void *)p, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+    }
+    /* Check */
+    for (i = 0; i < 4; i++)
+    {
+        ASSERT(localUserDataObject.offset[i] == i+4);
+    }
+
+    VX_CALL(vxReleaseUserDataObject(&user_data_object));
+    ASSERT(user_data_object == 0);
+}
+
+TEST(UserDataObject, test_vxMapUserDataObjectWrite)
+{
+    vx_context context = context_->vx_context_;
+    wb_t localUserDataObjectInit;
+    vx_user_data_object user_data_object;
+    int i;
+
+    /* Initialization */
+    localUserDataObjectInit.mode = 1;
+
+    for (i = 0; i < 4; i++)
+    {
+        localUserDataObjectInit.gain[i] = i+0x10000000;
+        localUserDataObjectInit.offset[i] = i+0x10000004;
+    }
+
+    ASSERT_VX_OBJECT(user_data_object = vxCreateUserDataObject(context, user_data_object_name, sizeof(wb_t), NULL), VX_TYPE_USER_DATA_OBJECT);
+
+    {
+		wb_t *p = NULL;
+        vx_map_id map_id;
+
+		/* Map, WRITE_ONLY mode*/
+        VX_CALL(vxMapUserDataObject(user_data_object, 0, sizeof(wb_t), &map_id, (void **)&p, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 0));
+        ASSERT(p != NULL);
+        memcpy(p, &localUserDataObjectInit, sizeof(wb_t));
+        VX_CALL(vxUnmapUserDataObject(user_data_object, map_id));
+
+		/* Map, READ_AND_WRITE mode*/
+
+        VX_CALL(vxMapUserDataObject(user_data_object, 0, sizeof(wb_t), &map_id, (void **)&p, VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0));
+        ASSERT(p != NULL);
+        /* Check */
+		ASSERT(localUserDataObjectInit.mode == p->mode);
+		for (i = 0; i < 4; i++)
+		{
+			ASSERT(localUserDataObjectInit.gain[i] == p->gain[i]);
+			ASSERT(localUserDataObjectInit.offset[i] == p->offset[i]);
+		}
+
+        /* Write into user data object */
+		p->mode = 2;
+		for (i = 0; i < 4; i++)
+		{
+			p->gain[i] = i;
+			p->offset[i] = i+4;
+		}
+        VX_CALL(vxUnmapUserDataObject(user_data_object, map_id));
+
+        /* Check */
+        VX_CALL(vxMapUserDataObject(user_data_object, 0, sizeof(wb_t), &map_id, (void **)&p, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0));
+		ASSERT(2 == p->mode);
+		for (i = 0; i < 4; i++)
+		{
+			ASSERT(p->gain[i] == i);
+			ASSERT(p->offset[i] == i+4);
+		}
+        VX_CALL(vxUnmapUserDataObject(user_data_object, map_id));
+    }
+
+    VX_CALL(vxReleaseUserDataObject(&user_data_object));
+    ASSERT(user_data_object == 0);
+}
+
+TESTCASE_TESTS(UserDataObject,
+        test_vxCreateUserDataObject,
+        test_vxCopyUserDataObjectRead,
+        test_vxCopyUserDataObjectWrite,
+        test_vxMapUserDataObjectWrite,
+        testUserKernel,
+        testUserKernelObjectArray,
+        testRemoveKernel,
+        testOutDelay
+        )
+
+#endif
diff --git a/test_conformance/test_usernode.c b/test_conformance/test_usernode.c
index 20c8897..138c387 100644
--- a/test_conformance/test_usernode.c
+++ b/test_conformance/test_usernode.c
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include "test_engine/test.h"
 #include <VX/vx.h>
 #include <VX/vxu.h>
@@ -734,6 +736,14 @@
 
     case VX_TYPE_REMAP:
         {
+            vx_coordinates2df_t *data = ct_alloc_mem(dst_width * dst_height * sizeof(vx_coordinates2df_t));
+            vx_rectangle_t rect;
+            rect.start_x = 0;
+            rect.start_y = 0;
+            rect.end_x = dst_width;
+            rect.end_y = dst_height;
+            vx_size user_stride_y = dst_width * sizeof(vx_coordinates2df_t);
+
             ASSERT_VX_OBJECT(src = (vx_reference)vxCreateRemap(context, src_width, src_height, dst_width, dst_height), type);
             ASSERT_VX_OBJECT(dst = (vx_reference)vxCreateRemap(context, src_width, src_height, dst_width, dst_height), type);
 
@@ -741,9 +751,14 @@
             {
                 for (j = 0; j < dst_height; j++)
                 {
-                    VX_CALL(vxSetRemapPoint((vx_remap)src, i, j, (vx_float32)((i + j) % src_width), (vx_float32)((i * j) % src_height)));
+                    data[j * dst_width + i].x = (vx_float32)((i + j) % src_width);
+                    data[j * dst_width + i].y = (vx_float32)((i * j) % src_height);
                 }
             }
+
+            VX_CALL(vxCopyRemapPatch((vx_remap)src, &rect, user_stride_y, (void *)data,
+                                      VX_TYPE_COORDINATES2DF, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+            ct_free_mem(data);
         }
         break;
 
@@ -767,10 +782,12 @@
 
     case VX_TYPE_THRESHOLD:
         {
-            ASSERT_VX_OBJECT(src = (vx_reference)vxCreateThreshold(context, thresh_type, item_type), type);
-            ASSERT_VX_OBJECT(dst = (vx_reference)vxCreateThreshold(context, thresh_type, item_type), type);
+            vx_pixel_value_t pixel_value = {0};
+            pixel_value.U8 = thresh_val;
+            ASSERT_VX_OBJECT(src = (vx_reference)vxCreateThresholdForImage(context, thresh_type, format, format), type);
+            ASSERT_VX_OBJECT(dst = (vx_reference)vxCreateThresholdForImage(context, thresh_type, format, format), type);
 
-            VX_CALL(vxSetThresholdAttribute((vx_threshold)src, VX_THRESHOLD_THRESHOLD_VALUE, (void *)&thresh_val, sizeof(thresh_val)));
+            VX_CALL(vxCopyThresholdValue((vx_threshold)src, &pixel_value, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
         }
         break;
 
@@ -969,7 +986,7 @@
         ASSERT_VX_OBJECT(exemplar = (vx_reference)vxCreateLUT(context, item_type, num_items), objarray_itemtype);
         break;
     case VX_TYPE_THRESHOLD:
-        ASSERT_VX_OBJECT(exemplar = (vx_reference)vxCreateThreshold(context, thresh_type, item_type), objarray_itemtype);
+        ASSERT_VX_OBJECT(exemplar = (vx_reference)vxCreateThresholdForImage(context, thresh_type, format, format), objarray_itemtype);
         break;
     default:
         break;
@@ -1062,3 +1079,5 @@
         testRemoveKernel,
         testOutDelay
         )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_vximage.c b/test_conformance/test_vximage.c
index 6257c54..d82efff 100644
--- a/test_conformance/test_vximage.c
+++ b/test_conformance/test_vximage.c
@@ -15,35 +15,113 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <string.h>
 #include <VX/vx.h>
 #include <VX/vxu.h>
 
 #include "test_engine/test.h"
 
+/* ***************************************************************************
+//  local auxiliary function definitions (only those that need early definitions)
+*/
+static void mem_free(void**ptr);
+
+static CT_Image own_generate_rand_image(const char* fileName, int width, int height, vx_df_image format);
+
+static vx_uint32 own_plane_subsampling_x(vx_df_image format, vx_uint32 plane);
+
+static vx_uint32 own_plane_subsampling_y(vx_df_image format, vx_uint32 plane);
+
+static void own_allocate_image_ptrs(vx_df_image format, int width, int height, vx_uint32* nplanes, void* ptrs[],
+    vx_imagepatch_addressing_t addr[], vx_pixel_value_t* val);
+
+
+/* ***************************************************************************
+//  Image tests
+*/
 TESTCASE(Image, CT_VXContext, ct_setup_vx_context, 0)
 
 typedef struct
 {
     const char* name;
     vx_df_image format;
-} format_arg;
+} ImageFormat_Arg;
 
-TEST_WITH_ARG(Image, testRngImageCreation, format_arg,
-    ARG_ENUM(VX_DF_IMAGE_U8),
-    ARG_ENUM(VX_DF_IMAGE_U16),
-    ARG_ENUM(VX_DF_IMAGE_S16),
-    ARG_ENUM(VX_DF_IMAGE_U32),
-    ARG_ENUM(VX_DF_IMAGE_S32),
-    ARG_ENUM(VX_DF_IMAGE_RGB),
-    ARG_ENUM(VX_DF_IMAGE_RGBX),
-    ARG_ENUM(VX_DF_IMAGE_NV12),
-    ARG_ENUM(VX_DF_IMAGE_NV21),
-    ARG_ENUM(VX_DF_IMAGE_UYVY),
-    ARG_ENUM(VX_DF_IMAGE_YUYV),
-    ARG_ENUM(VX_DF_IMAGE_IYUV),
-    ARG_ENUM(VX_DF_IMAGE_YUV4),
+typedef struct
+{
+    const char* name;
+    int width;
+    int height;
+    vx_df_image format;
+} ImageDims_Arg;
+
+typedef struct
+{
+    const char* testName;
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    int width;
+    int height;
+    vx_df_image format;
+    vx_bool have_roi;
+} ImageGenerator_Arg;
+
+#define VX_PLANE_MAX (4)
+
+#define IMAGE_FORMAT_PARAMETERS_BASELINE \
+    ARG_ENUM(VX_DF_IMAGE_U8), \
+    ARG_ENUM(VX_DF_IMAGE_U16), \
+    ARG_ENUM(VX_DF_IMAGE_S16), \
+    ARG_ENUM(VX_DF_IMAGE_U32), \
+    ARG_ENUM(VX_DF_IMAGE_S32), \
+    ARG_ENUM(VX_DF_IMAGE_RGB), \
+    ARG_ENUM(VX_DF_IMAGE_RGBX), \
+    ARG_ENUM(VX_DF_IMAGE_NV12), \
+    ARG_ENUM(VX_DF_IMAGE_NV21), \
+    ARG_ENUM(VX_DF_IMAGE_UYVY), \
+    ARG_ENUM(VX_DF_IMAGE_YUYV), \
+    ARG_ENUM(VX_DF_IMAGE_IYUV), \
+    ARG_ENUM(VX_DF_IMAGE_YUV4)
+
+#define ADD_IMAGE_FORMATS(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U8", __VA_ARGS__, VX_DF_IMAGE_U8)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U16", __VA_ARGS__, VX_DF_IMAGE_U16)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S16", __VA_ARGS__, VX_DF_IMAGE_S16)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U32", __VA_ARGS__, VX_DF_IMAGE_U32)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S32", __VA_ARGS__, VX_DF_IMAGE_S32)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGB", __VA_ARGS__, VX_DF_IMAGE_RGB)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGBX", __VA_ARGS__, VX_DF_IMAGE_RGBX)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_UYVY", __VA_ARGS__, VX_DF_IMAGE_UYVY)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUYV", __VA_ARGS__, VX_DF_IMAGE_YUYV)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV12", __VA_ARGS__, VX_DF_IMAGE_NV12)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV21", __VA_ARGS__, VX_DF_IMAGE_NV21)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUV4", __VA_ARGS__, VX_DF_IMAGE_YUV4)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_IYUV", __VA_ARGS__, VX_DF_IMAGE_IYUV))
+
+#define ADD_IMAGE_FORMAT_U1(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U1", __VA_ARGS__, VX_DF_IMAGE_U1))
+
+#define ADD_IMAGE_ROI(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/ROI=true", __VA_ARGS__, vx_true_e)), \
+    CT_EXPAND(nextmacro(testArgName "/ROI=false", __VA_ARGS__, vx_false_e))
+
+#define NO_IMAGE_ROI(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "", __VA_ARGS__, vx_false_e))
+
+#define TEST_IMAGE_RANDOM_IMAGE_PARAMETERS \
+    CT_GENERATE_PARAMETERS(     "rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMATS,   NO_IMAGE_ROI, ARG, own_generate_rand_image, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_U1, NO_IMAGE_ROI, ARG, own_generate_rand_image, NULL)
+
+#define TEST_IMAGE_RANDOM_IMAGE_WITH_ROI_PARAMETERS \
+    CT_GENERATE_PARAMETERS(     "rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMATS,   ADD_IMAGE_ROI, ARG, own_generate_rand_image, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_U1, ADD_IMAGE_ROI, ARG, own_generate_rand_image, NULL)
+
+TEST_WITH_ARG(Image, testRngImageCreation, ImageFormat_Arg,
+    IMAGE_FORMAT_PARAMETERS_BASELINE,
     ARG_ENUM(VX_DF_IMAGE_VIRT),
+    ARG("_U1_/VX_DF_IMAGE_U1", VX_DF_IMAGE_U1),
 )
 {
     vx_context  context = context_->vx_context_;
@@ -51,7 +129,7 @@
     vx_image    clone   = 0;
     vx_df_image format  = arg_->format;
 
-    image = vxCreateImage(context, 4, 4, format);
+    image = vxCreateImage(context, 8, 8, format);
 
     if (format == VX_DF_IMAGE_VIRT)
     {
@@ -59,8 +137,6 @@
         PASS();
     }
 
-    // VX_CALL(ct_dump_vx_image_info(image));
-
     ASSERT_VX_OBJECT(image, VX_TYPE_IMAGE);
 
     ct_fill_image_random(image, &CT()->seed_);
@@ -73,23 +149,33 @@
 
     ASSERT(image == 0);
     ASSERT(clone == 0);
-}
+} /* testRngImageCreation() */
 
-TEST_WITH_ARG(Image, testVirtualImageCreation, format_arg,
-    ARG_ENUM(VX_DF_IMAGE_U8),
-    ARG_ENUM(VX_DF_IMAGE_U16),
-    ARG_ENUM(VX_DF_IMAGE_S16),
-    ARG_ENUM(VX_DF_IMAGE_U32),
-    ARG_ENUM(VX_DF_IMAGE_S32),
-    ARG_ENUM(VX_DF_IMAGE_RGB),
-    ARG_ENUM(VX_DF_IMAGE_RGBX),
-    ARG_ENUM(VX_DF_IMAGE_NV12),
-    ARG_ENUM(VX_DF_IMAGE_NV21),
-    ARG_ENUM(VX_DF_IMAGE_UYVY),
-    ARG_ENUM(VX_DF_IMAGE_YUYV),
-    ARG_ENUM(VX_DF_IMAGE_IYUV),
-    ARG_ENUM(VX_DF_IMAGE_YUV4),
+/*
+// Creation and destruction of U1 images should be supported even without the U1 conformance profile
+*/
+TEST(Image, testImageCreation_U1)
+{
+    // Test vxCreateImage()
+    vx_context context = context_->vx_context_;
+    vx_image image = 0;
+    vx_uint32 width = 16;
+    vx_uint32 height = 16;
+    vx_df_image format = VX_DF_IMAGE_U1;
+
+    image = vxCreateImage(context, width, height, format);
+
+    ASSERT_VX_OBJECT(image, VX_TYPE_IMAGE);
+
+    VX_CALL(vxReleaseImage(&image));
+
+    ASSERT(image == 0);
+} /* testImageCreation_U1() */
+
+TEST_WITH_ARG(Image, testVirtualImageCreation, ImageFormat_Arg,
+    IMAGE_FORMAT_PARAMETERS_BASELINE,
     ARG_ENUM(VX_DF_IMAGE_VIRT),
+    ARG_ENUM(VX_DF_IMAGE_U1),
 )
 {
     vx_context context = context_->vx_context_;
@@ -113,16 +199,9 @@
     ASSERT(image == 0);
     ASSERT(clone == 0);
     ASSERT(graph == 0);
-}
+} /* testVirtualImageCreation() */
 
-typedef struct {
-    const char* name;
-    int width;
-    int height;
-    vx_df_image format;
-} dims_arg;
-
-TEST_WITH_ARG(Image, testVirtualImageCreationDims, dims_arg,
+TEST_WITH_ARG(Image, testVirtualImageCreationDims, ImageDims_Arg,
     ARG("0_0_REAL", 0, 0, VX_DF_IMAGE_U8),
     ARG("DISABLED_0_4_REAL", 0, 4, VX_DF_IMAGE_U8),
     ARG("DISABLED_4_0_REAL", 4, 0, VX_DF_IMAGE_U8),
@@ -131,7 +210,7 @@
     ARG("DISABLED_0_4_VIRT", 0, 4, VX_DF_IMAGE_VIRT),
     ARG("DISABLED_4_0_VIRT", 4, 0, VX_DF_IMAGE_VIRT),
     ARG("4_4_VIRT", 4, 4, VX_DF_IMAGE_VIRT),
-    )
+)
 {
     vx_context context = context_->vx_context_;
     vx_image   image   = 0;
@@ -153,197 +232,12 @@
     ASSERT(image == 0);
     ASSERT(clone == 0);
     ASSERT(graph == 0);
-}
+} /* testVirtualImageCreationDims() */
 
-
-TEST_WITH_ARG(Image, testConvert_CT_Image, format_arg,
-    ARG_ENUM(VX_DF_IMAGE_U8),
-    ARG_ENUM(VX_DF_IMAGE_U16),
-    ARG_ENUM(VX_DF_IMAGE_S16),
-    ARG_ENUM(VX_DF_IMAGE_U32),
-    ARG_ENUM(VX_DF_IMAGE_S32),
-    ARG_ENUM(VX_DF_IMAGE_RGB),
-    ARG_ENUM(VX_DF_IMAGE_RGBX),
-    ARG_ENUM(VX_DF_IMAGE_NV12),
-    ARG_ENUM(VX_DF_IMAGE_NV21),
-    ARG_ENUM(VX_DF_IMAGE_UYVY),
-    ARG_ENUM(VX_DF_IMAGE_YUYV),
-    ARG_ENUM(VX_DF_IMAGE_IYUV),
-    ARG_ENUM(VX_DF_IMAGE_YUV4),
+TEST_WITH_ARG(Image, testCreateImageFromHandle, ImageGenerator_Arg,
+    TEST_IMAGE_RANDOM_IMAGE_PARAMETERS
 )
 {
-    vx_context context = context_->vx_context_;
-    vx_image   image   = 0,
-               image2  = 0;
-    CT_Image   ctimg   = 0,
-               ctimg2  = 0;
-
-    image = vxCreateImage(context, 16, 16, arg_->format);
-    ASSERT_VX_OBJECT(image, VX_TYPE_IMAGE);
-
-    ASSERT_NO_FAILURE(ct_fill_image_random(image, &CT()->seed_));
-
-    ASSERT_NO_FAILURE(ctimg = ct_image_from_vx_image(image));
-
-    ASSERT_NO_FAILURE(image2 = ct_image_to_vx_image(ctimg, context));
-
-    ASSERT_NO_FAILURE(ctimg2 = ct_image_from_vx_image(image2));
-
-    ASSERT_EQ_CTIMAGE(ctimg, ctimg2);
-
-    VX_CALL(vxReleaseImage(&image));
-    VX_CALL(vxReleaseImage(&image2));
-
-    ASSERT(image == 0);
-    ASSERT(image2 == 0);
-}
-
-
-/* ***************************************************************************
-//  local auxiliary functions
-*/
-
-/*
-// Generate input random pixel values
-*/
-static CT_Image own_generate_rand_image(const char* fileName, int width, int height, vx_df_image format)
-{
-    CT_Image image;
-
-    ASSERT_NO_FAILURE_(return 0,
-        image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 256));
-
-    return image;
-} /* own_generate_rand_image() */
-
-
-static
-vx_uint32 own_plane_subsampling_x(vx_df_image format, vx_uint32 plane)
-{
-    int subsampling_x = 0;
-
-    switch (format)
-    {
-    case VX_DF_IMAGE_IYUV:
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_UYVY:
-        subsampling_x = (0 == plane) ? 1 : 2;
-        break;
-
-    default:
-        subsampling_x = 1;
-        break;
-    }
-
-    return subsampling_x;
-}
-
-static
-vx_uint32 own_plane_subsampling_y(vx_df_image format, vx_uint32 plane)
-{
-    int subsampling_y = 0;
-
-    switch (format)
-    {
-    case VX_DF_IMAGE_IYUV:
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-        subsampling_y = (0 == plane) ? 1 : 2;
-        break;
-
-    default:
-        subsampling_y = 1;
-        break;
-    }
-
-    return subsampling_y;
-}
-
-static
-vx_uint32 own_elem_size(vx_df_image format, vx_uint32 plane)
-{
-    int channel_step_x = 0;
-
-    switch (format)
-    {
-    case VX_DF_IMAGE_U8:
-        channel_step_x = 1;
-        break;
-
-    case VX_DF_IMAGE_U16:
-    case VX_DF_IMAGE_S16:
-        channel_step_x = 2;
-        break;
-
-    case VX_DF_IMAGE_U32:
-    case VX_DF_IMAGE_S32:
-    case VX_DF_IMAGE_RGBX:
-        channel_step_x = 4;
-        break;
-
-    case VX_DF_IMAGE_RGB:
-        channel_step_x = 3;
-        break;
-
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_UYVY:
-        channel_step_x = 2;
-        break;
-
-    case VX_DF_IMAGE_IYUV:
-    case VX_DF_IMAGE_YUV4:
-        channel_step_x = 1;
-        break;
-
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-        channel_step_x = (0 == plane) ? 1 : 2;
-        break;
-
-    default:
-        channel_step_x = 0;
-    }
-
-    return channel_step_x;
-}
-
-typedef struct
-{
-    const char*      testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char*      fileName;
-    int              width;
-    int              height;
-    vx_df_image      format;
-
-} CreateImageFromHandle_Arg;
-
-
-#define VX_PLANE_MAX (4)
-
-#undef ADD_IMAGE_FORMAT
-#define ADD_IMAGE_FORMAT(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U8", __VA_ARGS__, VX_DF_IMAGE_U8)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U16", __VA_ARGS__, VX_DF_IMAGE_U16)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S16", __VA_ARGS__, VX_DF_IMAGE_S16)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U32", __VA_ARGS__, VX_DF_IMAGE_U32)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S32", __VA_ARGS__, VX_DF_IMAGE_S32)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGB", __VA_ARGS__, VX_DF_IMAGE_RGB)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGBX", __VA_ARGS__, VX_DF_IMAGE_RGBX)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_UYVY", __VA_ARGS__, VX_DF_IMAGE_UYVY)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUYV", __VA_ARGS__, VX_DF_IMAGE_YUYV)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV12", __VA_ARGS__, VX_DF_IMAGE_NV12)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV21", __VA_ARGS__, VX_DF_IMAGE_NV21)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUV4", __VA_ARGS__, VX_DF_IMAGE_YUV4)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_IYUV", __VA_ARGS__, VX_DF_IMAGE_IYUV))
-
-#define CREATE_IMAGE_FROM_HANDLE_PARAMETERS \
-    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(Image, testCreateImageFromHandle, CreateImageFromHandle_Arg, CREATE_IMAGE_FROM_HANDLE_PARAMETERS)
-{
     vx_uint32 n;
     vx_uint32 nplanes;
     vx_context context = context_->vx_context_;
@@ -365,6 +259,7 @@
 
     switch (arg_->format)
     {
+    case VX_DF_IMAGE_U1:
     case VX_DF_IMAGE_U8:
     case VX_DF_IMAGE_U16:
     case VX_DF_IMAGE_S16:
@@ -406,6 +301,8 @@
         addr[n].dim_y    = src->height / ct_image_get_channel_subsampling_y(src, channel[n]);
         addr[n].stride_x = ct_image_get_channel_step_x(src, channel[n]);
         addr[n].stride_y = ct_image_get_channel_step_y(src, channel[n]);
+        if (arg_->format == VX_DF_IMAGE_U1)
+            addr[n].stride_x_bits = 1;
 
         ptrs[n] = ct_image_get_plane_base(src, n);
     }
@@ -421,323 +318,9 @@
     ASSERT(image == 0);
 } /* testCreateImageFromHandle() */
 
-
-static uint32_t own_stride_bytes(vx_df_image format, int step)
-{
-    uint32_t factor = 0;
-
-    switch (format)
-    {
-    case VX_DF_IMAGE_U8:
-    case VX_DF_IMAGE_NV21:
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_YUV4:
-    case VX_DF_IMAGE_IYUV:
-        factor = 1;
-        break;
-
-    case VX_DF_IMAGE_U16:
-    case VX_DF_IMAGE_S16:
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_UYVY:
-        factor = 2;
-        break;
-
-    case VX_DF_IMAGE_U32:
-    case VX_DF_IMAGE_S32:
-    case VX_DF_IMAGE_RGBX:
-        factor = 4;
-        break;
-
-    case VX_DF_IMAGE_RGB:
-        factor = 3;
-        break;
-
-    default:
-        ASSERT_(return 0, 0);
-    }
-
-    return step*factor;
-}
-
-
-static int own_get_channel_step_x(vx_df_image format, vx_enum channel)
-{
-    switch (format)
-    {
-    case VX_DF_IMAGE_U8:
-        return 1;
-
-    case VX_DF_IMAGE_U16:
-    case VX_DF_IMAGE_S16:
-        return 2;
-
-    case VX_DF_IMAGE_U32:
-    case VX_DF_IMAGE_S32:
-    case VX_DF_IMAGE_RGBX:
-        return 4;
-
-    case VX_DF_IMAGE_RGB:
-        return 3;
-
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_UYVY:
-        if (channel == VX_CHANNEL_Y)
-            return 2;
-        return 4;
-
-    case VX_DF_IMAGE_IYUV:
-    case VX_DF_IMAGE_YUV4:
-        return 1;
-
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-        if (channel == VX_CHANNEL_Y)
-            return 1;
-        return 2;
-
-    default:
-        ASSERT_(return 0, 0);
-    }
-
-    return 0;
-}
-
-
-static int own_get_channel_step_y(vx_df_image format, vx_enum channel, int step)
-{
-    switch (format)
-    {
-    case VX_DF_IMAGE_U8:
-        return step;
-
-    case VX_DF_IMAGE_U16:
-    case VX_DF_IMAGE_S16:
-        return step * 2;
-
-    case VX_DF_IMAGE_U32:
-    case VX_DF_IMAGE_S32:
-    case VX_DF_IMAGE_RGBX:
-        return step * 4;
-
-    case VX_DF_IMAGE_RGB:
-        return step * 3;
-
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_UYVY:
-        return step * 2;
-
-    case VX_DF_IMAGE_IYUV:
-        return (channel == VX_CHANNEL_Y) ? step : step / 2;
-
-    case VX_DF_IMAGE_YUV4:
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-        return step;
-
-    default:
-        ASSERT_(return 0, 0);
-    }
-
-    return 0;
-}
-
-
-static int own_get_channel_subsampling_x(vx_df_image format, vx_enum channel)
-{
-    if (channel == VX_CHANNEL_Y)
-        return 1;
-
-    switch (format)
-    {
-    case VX_DF_IMAGE_IYUV:
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_UYVY:
-        return 2;
-    }
-
-    return 1;
-}
-
-
-int own_get_channel_subsampling_y(vx_df_image format, vx_enum channel)
-{
-    if (channel == VX_CHANNEL_Y)
-        return 1;
-
-    switch (format)
-    {
-    case VX_DF_IMAGE_IYUV:
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-        return 2;
-
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_UYVY:
-        return 1;
-    }
-
-    return 1;
-}
-
-
-static unsigned int own_image_bits_per_pixel(vx_df_image format, unsigned int p)
-{
-    switch (format)
-    {
-    case VX_DF_IMAGE_U8:
-        return 8 * 1;
-
-    case VX_DF_IMAGE_U16:
-    case VX_DF_IMAGE_S16:
-    case VX_DF_IMAGE_UYVY:
-    case VX_DF_IMAGE_YUYV:
-        return 8 * 2;
-
-    case VX_DF_IMAGE_U32:
-    case VX_DF_IMAGE_S32:
-    case VX_DF_IMAGE_RGBX:
-        return 8 * 4;
-
-    case VX_DF_IMAGE_RGB:
-    case VX_DF_IMAGE_YUV4:
-        return 8 * 3;
-
-    case VX_DF_IMAGE_IYUV:
-        return 8 * 3 / 2;
-
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-        if (p == 0)
-            return 8 * 1;
-        else
-            return 8 * 2;
-
-    default:
-        CT_RecordFailure();
-        return 0;
-    };
-}
-
-static size_t own_plane_size(uint32_t width, uint32_t height, unsigned int p, vx_df_image format)
-{
-    return (size_t)(width * height * own_image_bits_per_pixel(format, p) / 8);
-}
-
-
-/*
-// Allocates image plane pointers from user controlled memory according to format, width, height params
-// and initialize with some value
-*/
-static void own_allocate_image_ptrs(
-    vx_df_image format, int width, int height,
-    vx_uint32* nplanes, void* ptrs[], vx_imagepatch_addressing_t addr[],
-    vx_pixel_value_t* val)
-{
-    unsigned int p;
-    int channel[VX_PLANE_MAX] = { 0, 0, 0, 0 };
-
-    switch (format)
-    {
-    case VX_DF_IMAGE_U8:
-    case VX_DF_IMAGE_U16:
-    case VX_DF_IMAGE_S16:
-    case VX_DF_IMAGE_U32:
-    case VX_DF_IMAGE_S32:
-        channel[0] = VX_CHANNEL_0;
-        break;
-
-    case VX_DF_IMAGE_RGB:
-    case VX_DF_IMAGE_RGBX:
-        channel[0] = VX_CHANNEL_R;
-        channel[1] = VX_CHANNEL_G;
-        channel[2] = VX_CHANNEL_B;
-        channel[3] = VX_CHANNEL_A;
-        break;
-
-    case VX_DF_IMAGE_UYVY:
-    case VX_DF_IMAGE_YUYV:
-    case VX_DF_IMAGE_NV12:
-    case VX_DF_IMAGE_NV21:
-    case VX_DF_IMAGE_YUV4:
-    case VX_DF_IMAGE_IYUV:
-        channel[0] = VX_CHANNEL_Y;
-        channel[1] = VX_CHANNEL_U;
-        channel[2] = VX_CHANNEL_V;
-        break;
-
-    default:
-        ASSERT(0);
-    }
-
-    ASSERT_NO_FAILURE(*nplanes = ct_get_num_planes(format));
-
-    for (p = 0; p < *nplanes; p++)
-    {
-        size_t plane_size = 0;
-
-        vx_uint32 subsampling_x = own_get_channel_subsampling_x(format, channel[p]);
-        vx_uint32 subsampling_y = own_get_channel_subsampling_y(format, channel[p]);
-
-        addr[p].dim_x    = width  / subsampling_x;
-        addr[p].dim_y    = height / subsampling_y;
-        addr[p].stride_x = own_get_channel_step_x(format, channel[p]);
-        addr[p].stride_y = own_get_channel_step_y(format, channel[p], width);
-
-        plane_size = addr[p].stride_y * addr[p].dim_y;
-
-        if (plane_size != 0)
-        {
-            ptrs[p] = ct_alloc_mem(plane_size);
-            /* init memory */
-            ct_memset(ptrs[p], val->reserved[p], plane_size);
-        }
-    }
-
-    return;
-}
-
-
-typedef struct
-{
-    const char*      testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char*      fileName;
-    int              width;
-    int              height;
-    vx_df_image      format;
-    vx_bool          have_roi;
-
-} SwapImageHandle_Arg;
-
-
-#define VX_PLANE_MAX (4)
-
-#define ADD_IMAGE_FORMAT(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U8", __VA_ARGS__, VX_DF_IMAGE_U8)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U16", __VA_ARGS__, VX_DF_IMAGE_U16)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S16", __VA_ARGS__, VX_DF_IMAGE_S16)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U32", __VA_ARGS__, VX_DF_IMAGE_U32)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S32", __VA_ARGS__, VX_DF_IMAGE_S32)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGB", __VA_ARGS__, VX_DF_IMAGE_RGB)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGBX", __VA_ARGS__, VX_DF_IMAGE_RGBX)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_UYVY", __VA_ARGS__, VX_DF_IMAGE_UYVY)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUYV", __VA_ARGS__, VX_DF_IMAGE_YUYV)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV12", __VA_ARGS__, VX_DF_IMAGE_NV12)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV21", __VA_ARGS__, VX_DF_IMAGE_NV21)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUV4", __VA_ARGS__, VX_DF_IMAGE_YUV4)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_IYUV", __VA_ARGS__, VX_DF_IMAGE_IYUV))
-
-#define ADD_IMAGE_ROI(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/ROI=true", __VA_ARGS__, vx_true_e)), \
-    CT_EXPAND(nextmacro(testArgName "/ROI=false", __VA_ARGS__, vx_false_e))
-
-#define SWAP_IMAGE_HANDLE_PARAMETERS \
-    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ADD_IMAGE_ROI, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(Image, testSwapImageHandle, SwapImageHandle_Arg, SWAP_IMAGE_HANDLE_PARAMETERS)
+TEST_WITH_ARG(Image, testSwapImageHandle, ImageGenerator_Arg,
+    TEST_IMAGE_RANDOM_IMAGE_WITH_ROI_PARAMETERS
+)
 {
     vx_uint32 n;
     vx_context context = context_->vx_context_;
@@ -805,10 +388,11 @@
 
         vx_rectangle_t roi1_rect =
         {
-            arg_->width / 2,
-            arg_->height / 2,
-            arg_->width,
-            arg_->height
+            /* U1 subimages must start on byte boundary */
+            (vx_uint32)(arg_->format == VX_DF_IMAGE_U1 ? ((arg_->width / 2 + 7) / 8) * 8 : arg_->width / 2),
+            (vx_uint32)arg_->height / 2,
+            (vx_uint32)arg_->width,
+            (vx_uint32)arg_->height
         };
 
         vx_rectangle_t roi2_rect;
@@ -819,7 +403,7 @@
         VX_CALL(vxQueryImage(roi1, VX_IMAGE_WIDTH, &roi1_width, sizeof(vx_uint32)));
         VX_CALL(vxQueryImage(roi1, VX_IMAGE_HEIGHT, &roi1_height, sizeof(vx_uint32)));
 
-        roi2_rect.start_x = roi1_width / 2;
+        roi2_rect.start_x = arg_->format == VX_DF_IMAGE_U1 ? ((roi1_width / 2 + 7) / 8 ) * 8 : roi1_width / 2;
         roi2_rect.start_y = roi1_height / 2;
         roi2_rect.end_x   = roi1_width;
         roi2_rect.end_y   = roi1_height;
@@ -827,7 +411,7 @@
         /* second level subimage */
         ASSERT_VX_OBJECT(roi2 = vxCreateImageFromROI(roi1, &roi2_rect), VX_TYPE_IMAGE);
 
-        /* try to get back ROI pointers */        
+        /* try to get back ROI pointers */
         ASSERT_NE_VX_STATUS(VX_SUCCESS, vxSwapImageHandle(roi2, NULL, prev_ptrs, nplanes1));
 
         /* try to replace and get back ROI pointers */
@@ -852,7 +436,7 @@
             {
                 for (j = 0; j < addr.dim_x; j += addr.step_x)
                 {
-                    unsigned char* p = vxFormatImagePatchAddress2d(plane_ptr, j, i, &addr);
+                    unsigned char* p = (unsigned char*)vxFormatImagePatchAddress2d(plane_ptr, j, i, &addr);
                     if (p[0] != val1.reserved[n])
                         CT_FAIL("ROI content mismath at [x=%d, y=%d]: expected %d, actual %d", j, i, val1, p[0]);
                 }
@@ -882,7 +466,7 @@
             {
                 for (j = 0; j < addr.dim_x; j += addr.step_x)
                 {
-                    unsigned char* p = vxFormatImagePatchAddress2d(plane_ptr, j, i, &addr);
+                    unsigned char* p = (unsigned char*)vxFormatImagePatchAddress2d(plane_ptr, j, i, &addr);
                     if (p[0] != val2.reserved[n])
                         CT_FAIL("ROI content mismath at [x=%d, y=%d]: expected %d, actual %d", j, i, val2, p[0]);
                 }
@@ -909,7 +493,7 @@
             {
                 for (j = 0; j < addr.dim_x; j += addr.step_x)
                 {
-                    unsigned char* p = vxFormatImagePatchAddress2d(plane_ptr, j, i, &addr);
+                    unsigned char* p = (unsigned char*)vxFormatImagePatchAddress2d(plane_ptr, j, i, &addr);
                     *p = val3.reserved[n];
                 }
             }
@@ -922,7 +506,7 @@
         /* check that the reclaimed host memory contains the correct data */
         for (n = 0; n < nplanes2; n++)
         {
-            vx_uint8* plane_ptr = prev_ptrs[n];
+            vx_uint8* plane_ptr = (vx_uint8*)prev_ptrs[n];
             vx_uint32 i;
             vx_uint32 j;
             vx_uint32 subsampling_x = own_plane_subsampling_x(arg_->format, n);
@@ -936,7 +520,8 @@
             {
                 for (j = 0; j < addr2[n].dim_x; j++)
                 {
-                    unsigned int k = i * addr2[n].stride_y + j * addr2[n].stride_x;
+                    unsigned int k = i * addr2[n].stride_y;
+                    k += (addr2[n].stride_x == 0) ? (j * addr2[n].stride_x_bits) / 8 : j * addr2[n].stride_x;
 
                     unsigned char p = plane_ptr[k];
 
@@ -1083,40 +668,9 @@
     ASSERT(image2 == 0);
 } /* testSwapImageHandle() */
 
-
-typedef struct
-{
-    const char*      testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char*      fileName;
-    int              width;
-    int              height;
-    vx_df_image      format;
-
-} FormatImagePatchAddress1d_Arg;
-
-
-#define VX_PLANE_MAX (4)
-
-#define ADD_IMAGE_FORMAT(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U8", __VA_ARGS__, VX_DF_IMAGE_U8)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U16", __VA_ARGS__, VX_DF_IMAGE_U16)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S16", __VA_ARGS__, VX_DF_IMAGE_S16)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U32", __VA_ARGS__, VX_DF_IMAGE_U32)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_S32", __VA_ARGS__, VX_DF_IMAGE_S32)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGB", __VA_ARGS__, VX_DF_IMAGE_RGB)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_RGBX", __VA_ARGS__, VX_DF_IMAGE_RGBX)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_UYVY", __VA_ARGS__, VX_DF_IMAGE_UYVY)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUYV", __VA_ARGS__, VX_DF_IMAGE_YUYV)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV12", __VA_ARGS__, VX_DF_IMAGE_NV12)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV21", __VA_ARGS__, VX_DF_IMAGE_NV21)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUV4", __VA_ARGS__, VX_DF_IMAGE_YUV4)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_IYUV", __VA_ARGS__, VX_DF_IMAGE_IYUV))
-
-#define FORMAT_IMAGE_PATCH_ADDRESS_1D_PARAMETERS \
-    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(Image, testFormatImagePatchAddress1d, FormatImagePatchAddress1d_Arg, FORMAT_IMAGE_PATCH_ADDRESS_1D_PARAMETERS)
+TEST_WITH_ARG(Image, testFormatImagePatchAddress1d, ImageGenerator_Arg,
+    TEST_IMAGE_RANDOM_IMAGE_PARAMETERS
+)
 {
     vx_uint8* p1;
     vx_uint8* p2;
@@ -1175,10 +729,16 @@
         /* use linear addressing function */
         for (i = 0; i < addr1[n].dim_x*addr1[n].dim_y; i += addr1[n].step_x)
         {
-            p1 = vxFormatImagePatchAddress1d(ptrs1[n], i, &addr1[n]);
-            p2 = vxFormatImagePatchAddress1d(ptrs2[n], i, &addr2[n]);
+            p1 = (vx_uint8*)vxFormatImagePatchAddress1d(ptrs1[n], i, &addr1[n]);
+            p2 = (vx_uint8*)vxFormatImagePatchAddress1d(ptrs2[n], i, &addr2[n]);
             for (j = 0; j < addr1[n].stride_x; j++)
                 p2[j] = p1[j];
+            if (addr1[n].stride_x == 0 && addr1[n].stride_x_bits == 1)  // VX_DF_IMAGE_U1 image
+            {
+                vx_uint8 x = i % addr1[n].dim_x;
+                p2[0] = (p2[0] & ~(1 << (x % 8))) |
+                        (p1[0] &  (1 << (x % 8)));
+            }
         }
 
         VX_CALL(vxUnmapImagePatch(image1, map_id1));
@@ -1196,20 +756,40 @@
     ASSERT(image2 == 0);
 } /* testFormatImagePatchAddress1d() */
 
-TEST_WITH_ARG(Image, testvxSetImagePixelValues, format_arg,
-    ARG_ENUM(VX_DF_IMAGE_U8),
-    ARG_ENUM(VX_DF_IMAGE_U16),
-    ARG_ENUM(VX_DF_IMAGE_S16),
-    ARG_ENUM(VX_DF_IMAGE_U32),
-    ARG_ENUM(VX_DF_IMAGE_S32),
-    ARG_ENUM(VX_DF_IMAGE_RGB),
-    ARG_ENUM(VX_DF_IMAGE_RGBX),
-    ARG_ENUM(VX_DF_IMAGE_NV12),
-    ARG_ENUM(VX_DF_IMAGE_NV21),
-    ARG_ENUM(VX_DF_IMAGE_UYVY),
-    ARG_ENUM(VX_DF_IMAGE_YUYV),
-    ARG_ENUM(VX_DF_IMAGE_IYUV),
-    ARG_ENUM(VX_DF_IMAGE_YUV4),
+TEST_WITH_ARG(Image, testConvert_CT_Image, ImageFormat_Arg,
+    IMAGE_FORMAT_PARAMETERS_BASELINE,
+    ARG("_U1_/VX_DF_IMAGE_U1", VX_DF_IMAGE_U1),
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image   image   = 0,
+               image2  = 0;
+    CT_Image   ctimg   = 0,
+               ctimg2  = 0;
+
+    image = vxCreateImage(context, 16, 16, arg_->format);
+    ASSERT_VX_OBJECT(image, VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(ct_fill_image_random(image, &CT()->seed_));
+
+    ASSERT_NO_FAILURE(ctimg = ct_image_from_vx_image(image));
+
+    ASSERT_NO_FAILURE(image2 = ct_image_to_vx_image(ctimg, context));
+
+    ASSERT_NO_FAILURE(ctimg2 = ct_image_from_vx_image(image2));
+
+    ASSERT_EQ_CTIMAGE(ctimg, ctimg2);
+
+    VX_CALL(vxReleaseImage(&image));
+    VX_CALL(vxReleaseImage(&image2));
+
+    ASSERT(image == 0);
+    ASSERT(image2 == 0);
+} /* testConvert_CT_Image() */
+
+TEST_WITH_ARG(Image, testvxSetImagePixelValues, ImageFormat_Arg,
+    IMAGE_FORMAT_PARAMETERS_BASELINE,
+    ARG("_U1_/VX_DF_IMAGE_U1", VX_DF_IMAGE_U1),
 )
 {
     vx_context  context = context_->vx_context_;
@@ -1228,16 +808,19 @@
     vals.reserved[1] = 0x22;
     vals.reserved[2] = 0x33;
     vals.reserved[3] = 0x44;
-	
+
     vx_status status = vxSetImagePixelValues(image, &vals);
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, status);
 
     ASSERT_NO_FAILURE(ctimg = ct_image_from_vx_image(image));
 
     ASSERT_NO_FAILURE(refimg = ct_allocate_image(640, 480, arg_->format));
-	
+
     switch (arg_->format)
     {
+        case VX_DF_IMAGE_U1:
+            ct_memset(refimg->data.y, (vals.U1 ? 0xFF : 0x00), ((640 + 7) / 8) * 480);    // Set 8 pixels at a time
+            break;
         case VX_DF_IMAGE_U8:
             ct_memset(refimg->data.y, vals.U8, 640*480);
             break;
@@ -1324,22 +907,11 @@
 
     VX_CALL(vxReleaseImage(&image));
     ASSERT(image == 0);
-}
+} /* testvxSetImagePixelValues() */
 
-TEST_WITH_ARG(Image, testUniformImage, format_arg,
-    ARG_ENUM(VX_DF_IMAGE_U8),
-    ARG_ENUM(VX_DF_IMAGE_U16),
-    ARG_ENUM(VX_DF_IMAGE_S16),
-    ARG_ENUM(VX_DF_IMAGE_U32),
-    ARG_ENUM(VX_DF_IMAGE_S32),
-    ARG_ENUM(VX_DF_IMAGE_RGB),
-    ARG_ENUM(VX_DF_IMAGE_RGBX),
-    ARG_ENUM(VX_DF_IMAGE_NV12),
-    ARG_ENUM(VX_DF_IMAGE_NV21),
-    ARG_ENUM(VX_DF_IMAGE_UYVY),
-    ARG_ENUM(VX_DF_IMAGE_YUYV),
-    ARG_ENUM(VX_DF_IMAGE_IYUV),
-    ARG_ENUM(VX_DF_IMAGE_YUV4),
+TEST_WITH_ARG(Image, testUniformImage, ImageFormat_Arg,
+    IMAGE_FORMAT_PARAMETERS_BASELINE,
+    ARG("_U1_/VX_DF_IMAGE_U1", VX_DF_IMAGE_U1),
 )
 {
     vx_context context = context_->vx_context_;
@@ -1362,6 +934,9 @@
 
     switch (arg_->format)
     {
+        case VX_DF_IMAGE_U1:
+            ct_memset(refimg->data.y, (vals.U1 ? 0xFF : 0x00), ((640 + 7) / 8) * 480);    // Set 8 pixels at a time
+            break;
         case VX_DF_IMAGE_U8:
             ct_memset(refimg->data.y, vals.U8, 640*480);
             break;
@@ -1450,58 +1025,6 @@
     ASSERT(image == 0);
 } /* testUniformImage() */
 
-static void mem_free(void**ptr)
-{
-    ct_free_mem(*ptr);
-    *ptr = 0;
-}
-
-TEST(Image, testComputeImagePatchSize)
-{
-    vx_context context = context_->vx_context_;
-    vx_image   image   = 0;
-    vx_pixel_value_t val = {{ 0xAB }};
-    vx_size memsz;
-    vx_size count_pixels = 0;
-    vx_uint32 i;
-    vx_uint32 j;
-    vx_uint8* buffer;
-    vx_uint8* buffer0;
-    vx_rectangle_t rect             = { 0, 0, 640, 480 };
-    vx_imagepatch_addressing_t addr = { 640, 480, 1, 640 };
-
-    ASSERT_VX_OBJECT(image = vxCreateUniformImage(context, 640, 480, VX_DF_IMAGE_U8, &val), VX_TYPE_IMAGE);
-
-    memsz = vxComputeImagePatchSize(image, &rect, 0);
-    ASSERT(memsz >= 640*480);
-
-    ASSERT(buffer = ct_alloc_mem(memsz));
-    CT_RegisterForGarbageCollection(buffer, mem_free, CT_GC_OBJECT);
-    buffer0 = buffer;
-
-    // copy image data to our buffer
-    VX_CALL(vxCopyImagePatch(image, &rect, 0, &addr, buffer, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
-    ASSERT_EQ_PTR(buffer0, buffer);
-
-    for (i = 0; i < 480; ++i)
-    {
-        for (j = 0; j < 640; ++j)
-        {
-            vx_uint8* ptr = buffer + i * addr.stride_y + j;
-
-            // no out-of-bound access
-            ASSERT(ptr >= buffer && (vx_size)(ptr - buffer) < memsz);
-
-            count_pixels += (*ptr == val.U8);
-        }
-    }
-
-    ASSERT_EQ_INT(640*480, count_pixels);
-
-    VX_CALL(vxReleaseImage(&image));
-    ASSERT(image == 0);
-} /* testComputeImagePatchSize() */
-
 #define IMAGE_SIZE_X 320
 #define IMAGE_SIZE_Y 200
 #define PATCH_SIZE_X 33
@@ -1512,8 +1035,8 @@
 TEST(Image, testAccessCopyWrite)
 {
     vx_context context = context_->vx_context_;
-    vx_uint8 *localPatchDense = ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*sizeof(vx_uint8));
-    vx_uint8 *localPatchSparse = ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*3*3*sizeof(vx_uint8));
+    vx_uint8 *localPatchDense  = (vx_uint8*)ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*sizeof(vx_uint8));
+    vx_uint8 *localPatchSparse = (vx_uint8*)ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*3*3*sizeof(vx_uint8));
     vx_image image;
     int x, y;
     vx_map_id map_id;
@@ -1626,8 +1149,8 @@
 TEST(Image, testAccessCopyRead)
 {
     vx_context context = context_->vx_context_;
-    vx_uint8 *localPatchDense = ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*sizeof(vx_uint8));
-    vx_uint8 *localPatchSparse = ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*3*3*sizeof(vx_uint8));
+    vx_uint8 *localPatchDense  = (vx_uint8*)ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*sizeof(vx_uint8));
+    vx_uint8 *localPatchSparse = (vx_uint8*)ct_alloc_mem(PATCH_SIZE_X*PATCH_SIZE_Y*3*3*sizeof(vx_uint8));
     vx_image image;
     int x, y;
     vx_map_id map_id;
@@ -1723,49 +1246,60 @@
 TEST(Image, testAccessCopyWriteUniformImage)
 {
     vx_context context = context_->vx_context_;
-    vx_image   image   = 0;
+    vx_image image = 0;
+    vx_image roi_image = 0;
     vx_uint32 width = 320;
     vx_uint32 height = 240;
+    vx_uint32 roi_width = 128;
+    vx_uint32 roi_height = 128;
     vx_map_id map_id;
 
     vx_pixel_value_t vals = {{0xFF}};
-    ASSERT_VX_OBJECT(image = vxCreateUniformImage(context, width, height, VX_DF_IMAGE_U8, &vals), VX_TYPE_IMAGE);
-    vx_rectangle_t rect = {0, 0, 320, 240};
-    vx_imagepatch_addressing_t addr;
+    vx_rectangle_t rect = {0, 0, width, height};
+    vx_rectangle_t roi_rect = {0, 0, roi_width, roi_height};
+    vx_imagepatch_addressing_t addr = VX_IMAGEPATCH_ADDR_INIT;
+    vx_imagepatch_addressing_t roi_addr = VX_IMAGEPATCH_ADDR_INIT;
+    roi_addr.dim_x = roi_width;
+    roi_addr.dim_y = roi_height;
+    roi_addr.stride_x = 1;
+    roi_addr.stride_y = roi_width;
+
     vx_uint8 *internal_data = NULL;
-    //can get read-access
+    vx_uint8 *external_data = (vx_uint8 *)ct_alloc_mem(roi_width * roi_height * sizeof(vx_uint8));
+
+    ASSERT_VX_OBJECT(image = vxCreateUniformImage(context, width, height, VX_DF_IMAGE_U8, &vals), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(roi_image = vxCreateImageFromROI(image, &roi_rect), VX_TYPE_IMAGE);
+
+    // Can get read-access, cannot get write-access
     vx_status status = vxMapImagePatch(image, &rect, 0, &map_id, &addr, (void **)&internal_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X);
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, status);
     status = vxUnmapImagePatch(image, map_id);
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, status);
-    //can not get write-access
-    vx_uint32 roi_width = 128;
-    vx_uint32 roi_height = 128;
-    vx_rectangle_t roi_rect = {0, 0, roi_width, roi_height};
-    vx_uint8 *external_data = (vx_uint8 *)ct_alloc_mem(roi_width * roi_height * sizeof(vx_uint8));
-
-    //Write is not be allowed for uniformimage
-    status = vxCopyImagePatch(image, &roi_rect, 0, &addr, (void *)external_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
-    ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
-
-    //ok to read
-    status = vxCopyImagePatch(image, &roi_rect, 0, &addr, (void *)external_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
-    ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
-
-    //test ROI image(from uniform image), behaviour must be equal to uniform image
-    vx_image roi_image = 0;
     internal_data = NULL;
+    status = vxMapImagePatch(image, &rect, 0, &map_id, &addr, (void **)&internal_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X);
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
 
-    ASSERT_VX_OBJECT(roi_image = vxCreateImageFromROI(image, &roi_rect), VX_TYPE_IMAGE);
+    // Reading from the image is allowed, writing to the image is not allowed
+    status = vxCopyImagePatch(image, &roi_rect, 0, &roi_addr, (void *)external_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, status);
+    status = vxCopyImagePatch(image, &roi_rect, 0, &roi_addr, (void *)external_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+    ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
+
+    // Test ROI image(from uniform image), behaviour must be equal to uniform image
+    // Can get read-access, cannot get write-access
+    internal_data = NULL;
     status = vxMapImagePatch(roi_image, &roi_rect, 0, &map_id, &addr, (void **)&internal_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X);
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, status);
     status = vxUnmapImagePatch(roi_image, map_id);
     ASSERT_EQ_VX_STATUS(VX_SUCCESS, status);
-
-    status = vxCopyImagePatch(roi_image, &roi_rect, 0, &addr, (void *)external_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+    internal_data = NULL;
+    status = vxMapImagePatch(roi_image, &roi_rect, 0, &map_id, &addr, (void **)&internal_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X);
     ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
 
-    status = vxCopyImagePatch(roi_image, &roi_rect, 0, &addr, (void *)external_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
+    // Reading from the image is allowed, writing to the image is not allowed
+    status = vxCopyImagePatch(roi_image, &roi_rect, 0, &roi_addr, (void *)external_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, status);
+    status = vxCopyImagePatch(roi_image, &roi_rect, 0, &roi_addr, (void *)external_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
     ASSERT_NE_VX_STATUS(VX_SUCCESS, status);
 
     EXPECT_EQ_VX_STATUS(VX_SUCCESS, vxReleaseImage(&image));
@@ -1823,6 +1357,419 @@
 } /* testQueryImage() */
 
 
+/* ***************************************************************************
+//  local auxiliary functions
+*/
+
+/*
+// Generate input random pixel values
+*/
+static CT_Image own_generate_rand_image(const char* fileName, int width, int height, vx_df_image format)
+{
+    CT_Image image;
+
+    if (format == VX_DF_IMAGE_U1)
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 2));
+    else
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 256));
+
+    return image;
+} /* own_generate_rand_image() */
+
+static vx_uint32 own_plane_subsampling_x(vx_df_image format, vx_uint32 plane)
+{
+    int subsampling_x = 0;
+
+    switch (format)
+    {
+    case VX_DF_IMAGE_IYUV:
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_UYVY:
+        subsampling_x = (0 == plane) ? 1 : 2;
+        break;
+
+    default:
+        subsampling_x = 1;
+        break;
+    }
+
+    return subsampling_x;
+} /* own_plane_subsampling_x() */
+
+static vx_uint32 own_plane_subsampling_y(vx_df_image format, vx_uint32 plane)
+{
+    int subsampling_y = 0;
+
+    switch (format)
+    {
+    case VX_DF_IMAGE_IYUV:
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+        subsampling_y = (0 == plane) ? 1 : 2;
+        break;
+
+    default:
+        subsampling_y = 1;
+        break;
+    }
+
+    return subsampling_y;
+} /* own_plane_subsampling_y() */
+
+static vx_uint32 own_elem_size(vx_df_image format, vx_uint32 plane)
+{
+    int channel_step_x = 0;
+
+    switch (format)
+    {
+    case VX_DF_IMAGE_U1:
+        channel_step_x = 0;
+        break;
+
+    case VX_DF_IMAGE_U8:
+        channel_step_x = 1;
+        break;
+
+    case VX_DF_IMAGE_U16:
+    case VX_DF_IMAGE_S16:
+        channel_step_x = 2;
+        break;
+
+    case VX_DF_IMAGE_U32:
+    case VX_DF_IMAGE_S32:
+    case VX_DF_IMAGE_RGBX:
+        channel_step_x = 4;
+        break;
+
+    case VX_DF_IMAGE_RGB:
+        channel_step_x = 3;
+        break;
+
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_UYVY:
+        channel_step_x = 2;
+        break;
+
+    case VX_DF_IMAGE_IYUV:
+    case VX_DF_IMAGE_YUV4:
+        channel_step_x = 1;
+        break;
+
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+        channel_step_x = (0 == plane) ? 1 : 2;
+        break;
+
+    default:
+        channel_step_x = 0;
+    }
+
+    return channel_step_x;
+} /* own_elem_size() */
+
+static uint32_t own_stride_bytes(vx_df_image format, int step)
+{
+    uint32_t factor = 0;
+
+    switch (format)
+    {
+    case VX_DF_IMAGE_U1:
+        return (step + 7) / 8;
+
+    case VX_DF_IMAGE_U8:
+    case VX_DF_IMAGE_NV21:
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_YUV4:
+    case VX_DF_IMAGE_IYUV:
+        factor = 1;
+        break;
+
+    case VX_DF_IMAGE_U16:
+    case VX_DF_IMAGE_S16:
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_UYVY:
+        factor = 2;
+        break;
+
+    case VX_DF_IMAGE_U32:
+    case VX_DF_IMAGE_S32:
+    case VX_DF_IMAGE_RGBX:
+        factor = 4;
+        break;
+
+    case VX_DF_IMAGE_RGB:
+        factor = 3;
+        break;
+
+    default:
+        ASSERT_(return 0, 0);
+    }
+
+    return step*factor;
+} /* own_stride_bytes() */
+
+static int own_get_channel_step_x(vx_df_image format, vx_enum channel)
+{
+    switch (format)
+    {
+    case VX_DF_IMAGE_U1:
+        return 0;
+
+    case VX_DF_IMAGE_U8:
+        return 1;
+
+    case VX_DF_IMAGE_U16:
+    case VX_DF_IMAGE_S16:
+        return 2;
+
+    case VX_DF_IMAGE_U32:
+    case VX_DF_IMAGE_S32:
+    case VX_DF_IMAGE_RGBX:
+        return 4;
+
+    case VX_DF_IMAGE_RGB:
+        return 3;
+
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_UYVY:
+        if (channel == VX_CHANNEL_Y)
+            return 2;
+        return 4;
+
+    case VX_DF_IMAGE_IYUV:
+    case VX_DF_IMAGE_YUV4:
+        return 1;
+
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+        if (channel == VX_CHANNEL_Y)
+            return 1;
+        return 2;
+
+    default:
+        ASSERT_(return 0, 0);
+    }
+
+    return 0;
+} /* own_get_channel_step_x() */
+
+static int own_get_channel_step_y(vx_df_image format, vx_enum channel, int step)
+{
+    switch (format)
+    {
+    case VX_DF_IMAGE_U1:
+        return (step + 7) / 8;
+
+    case VX_DF_IMAGE_U8:
+        return step;
+
+    case VX_DF_IMAGE_U16:
+    case VX_DF_IMAGE_S16:
+        return step * 2;
+
+    case VX_DF_IMAGE_U32:
+    case VX_DF_IMAGE_S32:
+    case VX_DF_IMAGE_RGBX:
+        return step * 4;
+
+    case VX_DF_IMAGE_RGB:
+        return step * 3;
+
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_UYVY:
+        return step * 2;
+
+    case VX_DF_IMAGE_IYUV:
+        return (channel == VX_CHANNEL_Y) ? step : step / 2;
+
+    case VX_DF_IMAGE_YUV4:
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+        return step;
+
+    default:
+        ASSERT_(return 0, 0);
+    }
+
+    return 0;
+} /* own_get_channel_step_y() */
+
+static int own_get_channel_subsampling_x(vx_df_image format, vx_enum channel)
+{
+    if (channel == VX_CHANNEL_Y)
+        return 1;
+
+    switch (format)
+    {
+    case VX_DF_IMAGE_IYUV:
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_UYVY:
+        return 2;
+    }
+
+    return 1;
+} /* own_get_channel_subsampling_x() */
+
+int own_get_channel_subsampling_y(vx_df_image format, vx_enum channel)
+{
+    if (channel == VX_CHANNEL_Y)
+        return 1;
+
+    switch (format)
+    {
+    case VX_DF_IMAGE_IYUV:
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+        return 2;
+
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_UYVY:
+        return 1;
+    }
+
+    return 1;
+} /* own_get_channel_subsampling_y() */
+
+static unsigned int own_image_bits_per_pixel(vx_df_image format, unsigned int p)
+{
+    switch (format)
+    {
+    case VX_DF_IMAGE_U1:
+        return 1 * 1;
+
+    case VX_DF_IMAGE_U8:
+        return 8 * 1;
+
+    case VX_DF_IMAGE_U16:
+    case VX_DF_IMAGE_S16:
+    case VX_DF_IMAGE_UYVY:
+    case VX_DF_IMAGE_YUYV:
+        return 8 * 2;
+
+    case VX_DF_IMAGE_U32:
+    case VX_DF_IMAGE_S32:
+    case VX_DF_IMAGE_RGBX:
+        return 8 * 4;
+
+    case VX_DF_IMAGE_RGB:
+    case VX_DF_IMAGE_YUV4:
+        return 8 * 3;
+
+    case VX_DF_IMAGE_IYUV:
+        return 8 * 3 / 2;
+
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+        if (p == 0)
+            return 8 * 1;
+        else
+            return 8 * 2;
+
+    default:
+        CT_RecordFailure();
+        return 0;
+    };
+} /* own_image_bits_per_pixel() */
+
+static size_t own_plane_size(uint32_t width, uint32_t height, unsigned int p, vx_df_image format)
+{
+    if (format == VX_DF_IMAGE_U1)
+    {
+        /* round rows up to full bytes */
+        size_t rowSize = (size_t)(width * own_image_bits_per_pixel(format, p) + 7) / 8;
+        return (size_t)(rowSize * height);
+    }
+    else
+    {
+        return (size_t)(width * height * own_image_bits_per_pixel(format, p) / 8);
+    }
+} /* own_plane_size() */
+
+/*
+// Allocates image plane pointers from user controlled memory according to format, width, height params
+// and initialize with some value
+*/
+static void own_allocate_image_ptrs(
+    vx_df_image format, int width, int height,
+    vx_uint32* nplanes, void* ptrs[], vx_imagepatch_addressing_t addr[],
+    vx_pixel_value_t* val)
+{
+    unsigned int p;
+    int channel[VX_PLANE_MAX] = { 0, 0, 0, 0 };
+
+    switch (format)
+    {
+    case VX_DF_IMAGE_U1:
+    case VX_DF_IMAGE_U8:
+    case VX_DF_IMAGE_U16:
+    case VX_DF_IMAGE_S16:
+    case VX_DF_IMAGE_U32:
+    case VX_DF_IMAGE_S32:
+        channel[0] = VX_CHANNEL_0;
+        break;
+
+    case VX_DF_IMAGE_RGB:
+    case VX_DF_IMAGE_RGBX:
+        channel[0] = VX_CHANNEL_R;
+        channel[1] = VX_CHANNEL_G;
+        channel[2] = VX_CHANNEL_B;
+        channel[3] = VX_CHANNEL_A;
+        break;
+
+    case VX_DF_IMAGE_UYVY:
+    case VX_DF_IMAGE_YUYV:
+    case VX_DF_IMAGE_NV12:
+    case VX_DF_IMAGE_NV21:
+    case VX_DF_IMAGE_YUV4:
+    case VX_DF_IMAGE_IYUV:
+        channel[0] = VX_CHANNEL_Y;
+        channel[1] = VX_CHANNEL_U;
+        channel[2] = VX_CHANNEL_V;
+        break;
+
+    default:
+        ASSERT(0);
+    }
+
+    ASSERT_NO_FAILURE(*nplanes = ct_get_num_planes(format));
+
+    for (p = 0; p < *nplanes; p++)
+    {
+        size_t plane_size = 0;
+
+        vx_uint32 subsampling_x = own_get_channel_subsampling_x(format, channel[p]);
+        vx_uint32 subsampling_y = own_get_channel_subsampling_y(format, channel[p]);
+
+        addr[p].dim_x    = width  / subsampling_x;
+        addr[p].dim_y    = height / subsampling_y;
+        addr[p].stride_x = own_get_channel_step_x(format, channel[p]);
+        addr[p].stride_y = own_get_channel_step_y(format, channel[p], width);
+        if (format == VX_DF_IMAGE_U1)
+            addr[p].stride_x_bits = 1;
+
+        plane_size = addr[p].stride_y * addr[p].dim_y;
+
+        if (plane_size != 0)
+        {
+            ptrs[p] = ct_alloc_mem(plane_size);
+            /* init memory */
+            ct_memset(ptrs[p], val->reserved[p], plane_size);
+        }
+    }
+
+    return;
+} /* own_allocate_image_ptrs() */
+
+static void mem_free(void**ptr)
+{
+    ct_free_mem(*ptr);
+    *ptr = 0;
+} /* mem_free() */
+
 /*
 // Check image patch data in user memory against constant pixel value
 // Note:
@@ -1839,6 +1786,15 @@
         {
             switch (format)
             {
+            case VX_DF_IMAGE_U1:
+            {
+                vx_uint8 offset = x % 8;
+                vx_uint8* tst = (vx_uint8*)((vx_uint8*)ptr + y * addr->stride_y + (x * addr->stride_x_bits) / 8);
+                vx_uint8  ref = ref_val->U1 ? 1 : 0;
+                ASSERT_EQ_INT(ref, (tst[0] & (1 << offset)) >> offset );
+            }
+            break;
+
             case VX_DF_IMAGE_U8:
             {
                 vx_uint8* tst = (vx_uint8*)((vx_uint8*)ptr + y * addr->stride_y + x * addr->stride_x);
@@ -1981,6 +1937,18 @@
 {
     switch (format)
     {
+    case VX_DF_IMAGE_U1:
+    {
+        ref_addr[0].dim_x   = ref->width + ref->roi.x % 8;
+        ref_addr[0].dim_y   = ref->height;
+        ref_addr[0].stride_x = 0;
+        ref_addr[0].stride_y = (ref->stride + 7) / 8;
+        ref_addr[0].stride_x_bits = 1;
+
+        ref_ptrs[0] = ref->data.y;
+    }
+    break;
+
     case VX_DF_IMAGE_U8:
     {
         ref_addr[0].dim_x   = ref->width;
@@ -2165,12 +2133,25 @@
     vx_uint32 y;
     vx_uint32 elem_size = own_elem_size(format, plane);
 
+    uint32_t xROIOffset = (format == VX_DF_IMAGE_U1) ? ref->roi.x % 8 : 0;     // Offset needed for U1 ROI
     for (y = 0; y < tst_addr->dim_y; y++)
     {
-        for (x = 0; x < tst_addr->dim_x; x++)
+        for (x = xROIOffset; x < tst_addr->dim_x + xROIOffset; x++)
         {
             switch (format)
             {
+            case VX_DF_IMAGE_U1:
+            {
+                vx_uint8  offset  = x % 8;
+                vx_uint8* tst_ptr = (vx_uint8*)((vx_uint8*)ptr + y * tst_addr->stride_y +
+                                                (x * tst_addr->stride_x_bits) / 8);
+                vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)ref->data.y + y * ct_stride_bytes(ref) +
+                                                (x * ct_image_bits_per_pixel(VX_DF_IMAGE_U1)) / 8);
+                ASSERT_EQ_INT((ref_ptr[0] & (1 << offset)) >> offset,
+                              (tst_ptr[0] & (1 << offset)) >> offset);
+            }
+            break;
+
             case VX_DF_IMAGE_U8:
             {
                 vx_uint8* tst_ptr = (vx_uint8*)((vx_uint8*)ptr + y * tst_addr->stride_y + x * tst_addr->stride_x);
@@ -2309,6 +2290,17 @@
         {
             switch (format)
             {
+            case VX_DF_IMAGE_U1:
+            {
+                vx_uint8  offset  = x % 8;
+                vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)p_ct_base + y * ct_stride_bytes(ctimg) +
+                                                (x * ct_image_bits_per_pixel(VX_DF_IMAGE_U1)) / 8);
+                vx_uint8* tst_ptr = (vx_uint8*)vxFormatImagePatchAddress2d(p_vx_base, x, y, vx_addr);
+                ASSERT_EQ_INT((ref_ptr[0] & (1 << offset)) >> offset,
+                              (tst_ptr[0] & (1 << offset)) >> offset);
+            }
+            break;
+
             case VX_DF_IMAGE_U8:
             {
                 vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)p_ct_base + y * ctimg->stride * ct_elem_size + x * ct_elem_size);
@@ -2436,6 +2428,319 @@
 
 
 /* ***************************************************************************
+//  vxCreateImageFromChannel tests
+*/
+TESTCASE(vxCreateImageFromChannel, CT_VXContext, ct_setup_vx_context, 0)
+
+typedef struct
+{
+    const char* testName;
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    int width;
+    int height;
+    vx_df_image format;
+    vx_enum channel;
+} CreateImageFromChannel_Arg;
+
+#define ADD_IMAGE_FORMAT_444(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUV4", __VA_ARGS__, VX_DF_IMAGE_YUV4))
+
+#define ADD_IMAGE_FORMAT_420(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_IYUV", __VA_ARGS__, VX_DF_IMAGE_IYUV)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV12", __VA_ARGS__, VX_DF_IMAGE_NV12)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV21", __VA_ARGS__, VX_DF_IMAGE_NV21))
+
+#define ADD_IMAGE_CHANNEL_YUV(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_Y", __VA_ARGS__, VX_CHANNEL_Y)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_U", __VA_ARGS__, VX_CHANNEL_U)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_V", __VA_ARGS__, VX_CHANNEL_V))
+
+#define ADD_IMAGE_CHANNEL_Y(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_Y", __VA_ARGS__, VX_CHANNEL_Y))
+
+#define CREATE_IMAGE_FROM_CHANNEL_UNIFORM_IMAGE_PARAMETERS \
+    CT_GENERATE_PARAMETERS("uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_444, ADD_IMAGE_CHANNEL_YUV, ARG, NULL, NULL), \
+    CT_GENERATE_PARAMETERS("uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_420, ADD_IMAGE_CHANNEL_Y,   ARG, NULL, NULL)
+
+#define CREATE_IMAGE_FROM_CHANNEL_RANDOM_IMAGE_PARAMETERS \
+    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_444, ADD_IMAGE_CHANNEL_YUV, ARG, own_generate_rand_image, NULL), \
+    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_420, ADD_IMAGE_CHANNEL_Y,   ARG, own_generate_rand_image, NULL)
+
+TEST_WITH_ARG(vxCreateImageFromChannel, testChannelFromUniformImage, CreateImageFromChannel_Arg,
+    CREATE_IMAGE_FROM_CHANNEL_UNIFORM_IMAGE_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src = 0;
+    vx_image ref = 0;
+    vx_image tst = 0;
+    vx_uint32 width  = arg_->width;
+    vx_uint32 height = arg_->height;
+    vx_pixel_value_t pixel_value;
+
+    pixel_value.YUV[0] = 0x55;
+    pixel_value.YUV[1] = 0xAA;
+    pixel_value.YUV[2] = 0x33;
+
+    EXPECT_VX_OBJECT(src = vxCreateUniformImage(context, arg_->width, arg_->height, arg_->format, &pixel_value), VX_TYPE_IMAGE);
+
+    if (VX_CHANNEL_Y != arg_->channel && VX_DF_IMAGE_IYUV == arg_->format)
+    {
+        width  /= 2;
+        height /= 2;
+    }
+
+    EXPECT_VX_OBJECT(ref = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    VX_CALL(vxuChannelExtract(context, src, arg_->channel, ref));
+
+    EXPECT_VX_OBJECT(tst = vxCreateImageFromChannel(src, arg_->channel), VX_TYPE_IMAGE);
+
+    {
+        CT_Image image_ref = ct_image_from_vx_image(ref);
+        CT_Image image_tst = ct_image_from_vx_image(tst);
+
+        EXPECT_EQ_CTIMAGE(image_ref, image_tst);
+    }
+
+    VX_CALL(vxReleaseImage(&ref));
+    VX_CALL(vxReleaseImage(&tst));
+    VX_CALL(vxReleaseImage(&src));
+} /* testChannelFromUniformImage() */
+
+TEST_WITH_ARG(vxCreateImageFromChannel, testChannelFromRandomImage, CreateImageFromChannel_Arg,
+    CREATE_IMAGE_FROM_CHANNEL_RANDOM_IMAGE_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src = 0;
+    vx_image ref = 0;
+    vx_image tst = 0;
+    vx_uint32 width  = arg_->width;
+    vx_uint32 height = arg_->height;
+    CT_Image image = NULL;
+
+    ASSERT_NO_FAILURE(image = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+
+    EXPECT_VX_OBJECT(src = ct_image_to_vx_image(image, context), VX_TYPE_IMAGE);
+
+    if (VX_CHANNEL_Y != arg_->channel && VX_DF_IMAGE_IYUV == arg_->format)
+    {
+        width  /= 2;
+        height /= 2;
+    }
+
+    EXPECT_VX_OBJECT(ref = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    VX_CALL(vxuChannelExtract(context, src, arg_->channel, ref));
+
+    EXPECT_VX_OBJECT(tst = vxCreateImageFromChannel(src, arg_->channel), VX_TYPE_IMAGE);
+
+    {
+        /* 1. check if image created from channel is equal to channel extracted from image */
+        CT_Image image_ref = ct_image_from_vx_image(ref);
+        CT_Image image_tst = ct_image_from_vx_image(tst);
+
+        EXPECT_EQ_CTIMAGE(image_ref, image_tst);
+    }
+
+    {
+        /* 2. check if modification of image created from channel reflected into channel of original image */
+        vx_uint32 i;
+        vx_uint32 j;
+        vx_uint32 p = (VX_CHANNEL_Y == arg_->channel ? 0 : (VX_CHANNEL_U == arg_->channel ? 1 : 2));
+        vx_rectangle_t rect = { 1, 1, 6, 6 };
+        vx_imagepatch_addressing_t addr =
+        {
+            rect.end_x - rect.start_x,
+            rect.end_y - rect.start_y,
+            1,
+            rect.end_x - rect.start_x
+        };
+
+        vx_size sz = 0;
+        void* ptr = 0;
+        vx_map_id tst_map_id;
+        vx_imagepatch_addressing_t map_addr;
+        void *tst_base = NULL;
+        vx_size numPixels;
+
+        VX_CALL(vxMapImagePatch(tst, &rect, 0, &tst_map_id, &map_addr, &tst_base, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0));
+        numPixels = ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) *
+                     ((rect.end_y-rect.start_y) * VX_SCALE_UNITY/map_addr.scale_y);
+        sz = numPixels * map_addr.stride_x;
+        VX_CALL(vxUnmapImagePatch(tst, tst_map_id));
+
+        ptr = ct_alloc_mem(sz);
+
+        /* fill image patch with some values */
+        for (i = 0; i < addr.dim_y; i++)
+        {
+            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
+            for (j = 0; j < addr.dim_x; j++)
+            {
+                p[j] = (vx_uint8)(i + j);
+            }
+        }
+
+        /* copy patch to channel image */
+        vxCopyImagePatch(tst, &rect, 0, &addr, ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+
+        /* clean patch memory */
+        ct_memset(ptr, 0, sz);
+
+        /* get channel patch from original image */
+        vxCopyImagePatch(src, &rect, p, &addr, ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
+
+        /* check channel changes has been reflected into original image */
+        for (i = 0; i < addr.dim_y; i++)
+        {
+            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
+            for (j = 0; j < addr.dim_x; j++)
+            {
+                EXPECT_EQ_INT((vx_uint8)(i + j), p[j]);
+            }
+        }
+
+        ct_free_mem(ptr);
+    }
+
+    {
+        /* 3. check if modification of channel in original image reflected into image created from channel */
+        vx_uint32 i;
+        vx_uint32 j;
+        vx_uint32 p = (VX_CHANNEL_Y == arg_->channel ? 0 : (VX_CHANNEL_U == arg_->channel ? 1 : 2));
+        vx_rectangle_t rect = { 1, 1, 6, 6 };
+        vx_imagepatch_addressing_t addr =
+        {
+            rect.end_x - rect.start_x,
+            rect.end_y - rect.start_y,
+            1,
+            rect.end_x - rect.start_x
+        };
+
+        vx_size sz = 0;
+        void* ptr = 0;
+        vx_map_id src_map_id;
+        vx_imagepatch_addressing_t map_addr;
+        void *src_base = NULL;
+        vx_size numPixels;
+
+        VX_CALL(vxMapImagePatch(src, &rect, p, &src_map_id, &map_addr, &src_base, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0));
+        numPixels = ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) *
+                     ((rect.end_y-rect.start_y) * VX_SCALE_UNITY/map_addr.scale_y);
+        sz = numPixels * map_addr.stride_x;
+        VX_CALL(vxUnmapImagePatch(src, src_map_id));
+
+        ptr = ct_alloc_mem(sz);
+
+        /* fill image patch with some values */
+        for (i = 0; i < addr.dim_y; i++)
+        {
+            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
+            for (j = 0; j < addr.dim_x; j++)
+            {
+                p[j] = (vx_uint8)(i + j);
+            }
+        }
+
+        /* copy patch to channel of original image */
+        vxCopyImagePatch(src, &rect, p, &addr, ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+
+        /* clean patch memory */
+        ct_memset(ptr, 0, sz);
+
+        /* get patch from image created from channel */
+        vxCopyImagePatch(tst, &rect, 0, &addr, ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
+
+        /* check changes of channel in original image has been reflected into channel image */
+        for (i = 0; i < addr.dim_y; i++)
+        {
+            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
+            for (j = 0; j < addr.dim_x; j++)
+            {
+                EXPECT_EQ_INT((vx_uint8)(i + j), p[j]);
+            }
+        }
+
+        ct_free_mem(ptr);
+    }
+
+    VX_CALL(vxReleaseImage(&ref));
+    VX_CALL(vxReleaseImage(&tst));
+    VX_CALL(vxReleaseImage(&src));
+} /* testChannelFromRandomImage() */
+
+TEST_WITH_ARG(vxCreateImageFromChannel, testChannelFromHandle, CreateImageFromChannel_Arg,
+    CREATE_IMAGE_FROM_CHANNEL_RANDOM_IMAGE_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image src = 0;
+    vx_image ref = 0;
+    vx_image tst = 0;
+
+    vx_uint32 width  = arg_->width;
+    vx_uint32 height = arg_->height;
+
+    CT_Image image = NULL;
+
+    ASSERT_NO_FAILURE(image = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+
+    {
+        vx_uint32 n;
+        vx_uint32 nplanes;
+
+        vx_enum channel[VX_PLANE_MAX] = { VX_CHANNEL_Y, VX_CHANNEL_U, VX_CHANNEL_V, 0 };
+
+        vx_imagepatch_addressing_t addr[VX_PLANE_MAX] =
+        {
+            VX_IMAGEPATCH_ADDR_INIT,
+            VX_IMAGEPATCH_ADDR_INIT,
+            VX_IMAGEPATCH_ADDR_INIT,
+            VX_IMAGEPATCH_ADDR_INIT
+        };
+        void* ptrs[VX_PLANE_MAX] = { 0, 0, 0, 0 };
+
+        ASSERT_NO_FAILURE(nplanes = ct_get_num_planes(arg_->format));
+
+        for (n = 0; n < nplanes; n++)
+        {
+            addr[n].dim_x    = image->width  / ct_image_get_channel_subsampling_x(image, channel[n]);
+            addr[n].dim_y    = image->height / ct_image_get_channel_subsampling_y(image, channel[n]);
+            addr[n].stride_x = ct_image_get_channel_step_x(image, channel[n]);
+            addr[n].stride_y = ct_image_get_channel_step_y(image, channel[n]);
+
+            ptrs[n] = ct_image_get_plane_base(image, n);
+        }
+
+        EXPECT_VX_OBJECT(src = vxCreateImageFromHandle(context, arg_->format, addr, ptrs, VX_MEMORY_TYPE_HOST), VX_TYPE_IMAGE);
+    }
+
+    if (VX_CHANNEL_Y != arg_->channel && VX_DF_IMAGE_IYUV == arg_->format)
+    {
+        width  /= 2;
+        height /= 2;
+    }
+
+    EXPECT_VX_OBJECT(ref = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
+    VX_CALL(vxuChannelExtract(context, src, arg_->channel, ref));
+
+    EXPECT_VX_OBJECT(tst = vxCreateImageFromChannel(src, arg_->channel), VX_TYPE_IMAGE);
+
+    {
+        CT_Image image_ref = ct_image_from_vx_image(ref);
+        CT_Image image_tst = ct_image_from_vx_image(tst);
+
+        EXPECT_EQ_CTIMAGE(image_ref, image_tst);
+    }
+
+    VX_CALL(vxReleaseImage(&ref));
+    VX_CALL(vxReleaseImage(&tst));
+    VX_CALL(vxReleaseImage(&src));
+} /* testChannelFromHandle() */
+
+
+/* ***************************************************************************
 //  vxCopyImagePatch tests
 */
 TESTCASE(vxCopyImagePatch, CT_VXContext, ct_setup_vx_context, 0)
@@ -2443,23 +2748,29 @@
 typedef struct
 {
     const char* testName;
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     int width;
     int height;
     vx_df_image format;
+} CopyImagePatch_Arg;
 
-} ReadUniformImage_Arg;
+#define COPY_IMAGE_PATCH_UNIFORM_IMAGE_PARAMETERS \
+    CT_GENERATE_PARAMETERS("uniform",      ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMATS,   ARG, NULL, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_U1, ARG, NULL, NULL)
 
-
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, NULL)
+#define COPY_IMAGE_PATCH_RANDOM_IMAGE_PARAMETERS \
+    CT_GENERATE_PARAMETERS("random",      ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMATS,   ARG, own_generate_rand_image, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/random", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_U1, ARG, own_generate_rand_image, NULL)
 
 /*
 // test vxCopyImagePatch in READ_ONLY mode from uniform image,
 // independed from vxCopyImagePatch in write mode
 // or vxAccessImagePatch/vxCommitImagePatch functions
 */
-TEST_WITH_ARG(vxCopyImagePatch, testReadUniformImage, ReadUniformImage_Arg, PARAMETERS)
+TEST_WITH_ARG(vxCopyImagePatch, testReadUniformImage, CopyImagePatch_Arg,
+    COPY_IMAGE_PATCH_UNIFORM_IMAGE_PARAMETERS
+)
 {
     vx_context context = context_->vx_context_;
 
@@ -2484,8 +2795,24 @@
         vx_imagepatch_addressing_t addr = VX_IMAGEPATCH_ADDR_INIT;
         void*   ptr = 0;
         vx_size sz  = 0;
+        vx_map_id image_map_id;
+        vx_imagepatch_addressing_t map_addr;
+        void *image_base = NULL;
+        vx_size numPixels;
 
-        sz = vxComputeImagePatchSize(image, &rect, (vx_uint32)plane);
+        VX_CALL(vxMapImagePatch(image, &rect, (vx_uint32)plane, &image_map_id, &map_addr, &image_base, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0));
+        numPixels = ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) *
+                     ((rect.end_y-rect.start_y) * VX_SCALE_UNITY/map_addr.scale_y);
+        if (map_addr.stride_x == 0 && map_addr.stride_x_bits != 0)
+        {
+            sz = numPixels * (map_addr.stride_x_bits *
+                ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) / 8);
+        }
+        else
+        {
+            sz = numPixels * map_addr.stride_x;
+        }
+        VX_CALL(vxUnmapImagePatch(image, image_map_id));
 
         ptr = ct_alloc_mem(sz);
         ASSERT(NULL != ptr);
@@ -2493,7 +2820,12 @@
         addr.dim_x    = arg_->width  / own_plane_subsampling_x(arg_->format, plane);
         addr.dim_y    = arg_->height / own_plane_subsampling_y(arg_->format, plane);
         addr.stride_x = own_elem_size(arg_->format, plane);
-        addr.stride_y = addr.dim_x * addr.stride_x;
+        if (arg_->format == VX_DF_IMAGE_U1) {
+            addr.stride_x_bits = 1;
+            addr.stride_y = (addr.dim_x * addr.stride_x_bits + 7) / 8;
+        }
+        else
+            addr.stride_y = addr.dim_x * addr.stride_x;
 
         /* read image patch */
         VX_CALL(vxCopyImagePatch(image, &rect, plane, &addr, ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
@@ -2510,24 +2842,9 @@
     return;
 } /* testReadUniformImage() */
 
-typedef struct
-{
-    const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char* fileName;
-    int width;
-    int height;
-    vx_df_image format;
-
-} ReadRandomImage_Arg;
-
-#ifdef PARAMETERS
-#undef PARAMETERS
-#endif
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(vxCopyImagePatch, testReadRandomImage, ReadRandomImage_Arg, PARAMETERS)
+TEST_WITH_ARG(vxCopyImagePatch, testReadRandomImage, CopyImagePatch_Arg,
+    COPY_IMAGE_PATCH_RANDOM_IMAGE_PARAMETERS
+)
 {
     vx_context context = context_->vx_context_;
 
@@ -2560,7 +2877,24 @@
         vx_size sz = 0;
         vx_uint32 elem_size = own_elem_size(arg_->format, plane);
 
-        sz = vxComputeImagePatchSize(image, &rect, plane);
+        vx_map_id image_map_id;
+        vx_imagepatch_addressing_t map_addr;
+        void *image_base = NULL;
+        vx_size numPixels;
+
+        VX_CALL(vxMapImagePatch(image, &rect, (vx_uint32)plane, &image_map_id, &map_addr, &image_base, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0));
+        numPixels = ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) *
+                     ((rect.end_y-rect.start_y) * VX_SCALE_UNITY/map_addr.scale_y);
+        if (map_addr.stride_x == 0 && map_addr.stride_x_bits != 0)
+        {
+            sz = numPixels * (map_addr.stride_x_bits *
+                ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) / 8);
+        }
+        else
+        {
+            sz = numPixels * map_addr.stride_x;
+        }
+        VX_CALL(vxUnmapImagePatch(image, image_map_id));
 
         ptr = ct_alloc_mem(sz);
         ASSERT(NULL != ptr);
@@ -2568,7 +2902,12 @@
         tst_addr.dim_x    = arg_->width  / own_plane_subsampling_x(arg_->format, plane);
         tst_addr.dim_y    = arg_->height / own_plane_subsampling_y(arg_->format, plane);
         tst_addr.stride_x = elem_size;
-        tst_addr.stride_y = tst_addr.dim_x * tst_addr.stride_x;
+        if (arg_->format == VX_DF_IMAGE_U1) {
+            tst_addr.stride_x_bits = 1;
+            tst_addr.stride_y = (tst_addr.dim_x * tst_addr.stride_x_bits + 7) / 8;
+        }
+        else
+            tst_addr.stride_y = tst_addr.dim_x * tst_addr.stride_x;
 
         VX_CALL(vxCopyImagePatch(image, &rect, plane, &tst_addr, ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
 
@@ -2584,25 +2923,9 @@
     return;
 } /* testReadRandomImage() */
 
-
-typedef struct
-{
-    const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char* fileName;
-    int width;
-    int height;
-    vx_df_image format;
-
-} WriteRandomImage_Arg;
-
-#ifdef PARAMETERS
-#undef PARAMETERS
-#endif
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(vxCopyImagePatch, testWriteRandomImage, WriteRandomImage_Arg, PARAMETERS)
+TEST_WITH_ARG(vxCopyImagePatch, testWriteRandomImage, CopyImagePatch_Arg,
+    COPY_IMAGE_PATCH_RANDOM_IMAGE_PARAMETERS
+)
 {
     vx_context context = context_->vx_context_;
 
@@ -2643,7 +2966,24 @@
         vx_size sz = 0;
         vx_uint32 elem_size = own_elem_size(arg_->format, plane);
 
-        sz = vxComputeImagePatchSize(image, &rect, plane);
+        vx_map_id image_map_id;
+        vx_imagepatch_addressing_t map_addr;
+        void *image_base = NULL;
+        vx_size numPixels;
+
+        VX_CALL(vxMapImagePatch(image, &rect, (vx_uint32)plane, &image_map_id, &map_addr, &image_base, VX_READ_ONLY, VX_MEMORY_TYPE_HOST, 0));
+        numPixels = ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) *
+                     ((rect.end_y-rect.start_y) * VX_SCALE_UNITY/map_addr.scale_y);
+        if (map_addr.stride_x == 0 && map_addr.stride_x_bits != 0)
+        {
+            sz = numPixels * (map_addr.stride_x_bits *
+                ((rect.end_x-rect.start_x) * VX_SCALE_UNITY/map_addr.scale_x) / 8);
+        }
+        else
+        {
+            sz = numPixels * map_addr.stride_x;
+        }
+        VX_CALL(vxUnmapImagePatch(image, image_map_id));
 
         ptr = ct_alloc_mem(sz);
         ASSERT(NULL != ptr);
@@ -2651,7 +2991,12 @@
         tst_addr.dim_x    = arg_->width  / own_plane_subsampling_x(arg_->format, plane);
         tst_addr.dim_y    = arg_->height / own_plane_subsampling_y(arg_->format, plane);
         tst_addr.stride_x = elem_size;
-        tst_addr.stride_y = tst_addr.dim_x * tst_addr.stride_x;
+        if (arg_->format == VX_DF_IMAGE_U1) {
+            tst_addr.stride_x_bits = 1;
+            tst_addr.stride_y = (tst_addr.dim_x * tst_addr.stride_x_bits + 7) / 8;
+        }
+        else
+            tst_addr.stride_y = tst_addr.dim_x * tst_addr.stride_x;
 
         VX_CALL(vxCopyImagePatch(image, &rect, plane, &tst_addr, ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
 
@@ -2676,24 +3021,29 @@
 typedef struct
 {
     const char* testName;
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
     int width;
     int height;
     vx_df_image format;
+} MapImagePatch_Arg;
 
-} MapReadUniformImage_Arg;
+#define MAP_IMAGE_PATCH_UNIFORM_IMAGE_PARAMETERS \
+    CT_GENERATE_PARAMETERS("uniform",      ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMATS,   ARG, NULL, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_U1, ARG, NULL, NULL)
 
-
-#undef PARAMETERS
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, NULL)
+#define MAP_IMAGE_PATCH_RANDOM_IMAGE_PARAMETERS \
+    CT_GENERATE_PARAMETERS("random",      ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMATS,   ARG, own_generate_rand_image, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/random", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_U1, ARG, own_generate_rand_image, NULL)
 
 /*
 // test vxMapImagePatch in READ_ONLY mode from uniform image,
 // independed from vxMapImagePatch/vxCopyImagePatch in write mode
 // or vxAccessImagePatch/vxCommitImagePatch functions
 */
-TEST_WITH_ARG(vxMapImagePatch, testMapReadUniformImage, MapReadUniformImage_Arg, PARAMETERS)
+TEST_WITH_ARG(vxMapImagePatch, testMapReadUniformImage, MapImagePatch_Arg,
+    MAP_IMAGE_PATCH_UNIFORM_IMAGE_PARAMETERS
+)
 {
     vx_context context = context_->vx_context_;
 
@@ -2729,6 +3079,13 @@
             {
                 switch (arg_->format)
                 {
+                case VX_DF_IMAGE_U1:
+                {
+                    vx_uint8* tst = (vx_uint8*)vxFormatImagePatchAddress2d(ptr, x, y, &addr);
+                    ASSERT_EQ_INT(ref_val.U1 ? 1 : 0, (tst[0] & (1 << (x % 8))) >> (x % 8));
+                }
+                break;
+
                 case VX_DF_IMAGE_U8:
                 {
                     vx_uint8* tst = (vx_uint8*)vxFormatImagePatchAddress2d(ptr, x, y, &addr);
@@ -2865,24 +3222,9 @@
     return;
 } /* testMapReadUniformImage() */
 
-typedef struct
-{
-    const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char* fileName;
-    int width;
-    int height;
-    vx_df_image format;
-
-} MapReadRandomImage_Arg;
-
-#ifdef PARAMETERS
-#undef PARAMETERS
-#endif
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(vxMapImagePatch, testMapReadRandomImage, MapReadRandomImage_Arg, PARAMETERS)
+TEST_WITH_ARG(vxMapImagePatch, testMapReadRandomImage, MapImagePatch_Arg,
+    MAP_IMAGE_PATCH_RANDOM_IMAGE_PARAMETERS
+)
 {
     vx_context context = context_->vx_context_;
 
@@ -2929,24 +3271,9 @@
     return;
 } /* testMapReadRandomImage() */
 
-typedef struct
-{
-    const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char* fileName;
-    int width;
-    int height;
-    vx_df_image format;
-
-} MapReadWriteRandomImage_Arg;
-
-#ifdef PARAMETERS
-#undef PARAMETERS
-#endif
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(vxMapImagePatch, testMapReadWriteRandomImage, MapReadWriteRandomImage_Arg, PARAMETERS)
+TEST_WITH_ARG(vxMapImagePatch, testMapReadWriteRandomImage, MapImagePatch_Arg,
+    MAP_IMAGE_PATCH_RANDOM_IMAGE_PARAMETERS
+)
 {
     vx_context context = context_->vx_context_;
 
@@ -3000,6 +3327,15 @@
             {
                 switch (arg_->format)
                 {
+                case VX_DF_IMAGE_U1:
+                {
+                    vx_uint8 offset = x % 8;
+                    vx_uint8* tst_ptr = (vx_uint8*)vxFormatImagePatchAddress2d(ptr, x, y, &tst_addr);
+                    tst_ptr[0] = ( tst_ptr[0] & ~(1 << offset)) |
+                                 (~tst_ptr[0] &  (1 << offset));
+                }
+                break;
+
                 case VX_DF_IMAGE_U8:
                 {
                     vx_uint8* tst_ptr = (vx_uint8*)vxFormatImagePatchAddress2d(ptr, x, y, &tst_addr);
@@ -3130,6 +3466,17 @@
             {
                 switch (arg_->format)
                 {
+                case VX_DF_IMAGE_U1:
+                {
+                    vx_uint8  offset  = x % 8;
+                    vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)ref->data.y + y * ct_stride_bytes(ref) +
+                                                    (x * ct_image_bits_per_pixel(VX_DF_IMAGE_U1)) / 8);
+                    vx_uint8* tst_ptr = (vx_uint8*)vxFormatImagePatchAddress2d(ptr, x, y, &tst_addr);
+                    ASSERT_EQ_INT(( ref_ptr[0] & (1 << offset)) >> offset,
+                                  (~tst_ptr[0] & (1 << offset)) >> offset);
+                }
+                break;
+
                 case VX_DF_IMAGE_U8:
                 {
                     vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)ref->data.y + y * ref->stride * elem_size + x * elem_size);
@@ -3261,24 +3608,9 @@
     return;
 } /* testMapReadWriteRandomImage() */
 
-typedef struct
-{
-    const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char* fileName;
-    int width;
-    int height;
-    vx_df_image format;
-
-} MapWriteRandomImage_Arg;
-
-#ifdef PARAMETERS
-#undef PARAMETERS
-#endif
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(vxMapImagePatch, testMapWriteRandomImage, MapWriteRandomImage_Arg, PARAMETERS)
+TEST_WITH_ARG(vxMapImagePatch, testMapWriteRandomImage, MapImagePatch_Arg,
+    MAP_IMAGE_PATCH_RANDOM_IMAGE_PARAMETERS
+)
 {
     vx_context context = context_->vx_context_;
 
@@ -3327,6 +3659,17 @@
             {
                 switch (arg_->format)
                 {
+                case VX_DF_IMAGE_U1:
+                {
+                    vx_uint8  offset  = x % 8;
+                    vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)ref->data.y + y * ct_stride_bytes(ref) +
+                                                    (x * ct_image_bits_per_pixel(VX_DF_IMAGE_U1)) / 8);
+                    vx_uint8* tst_ptr = (vx_uint8*)vxFormatImagePatchAddress2d(ptr, x, y, &tst_addr);
+                    tst_ptr[0] = (( tst_ptr[0] & ~(1 << offset)) |
+                                  (~ref_ptr[0] &  (1 << offset)));
+                }
+                break;
+
                 case VX_DF_IMAGE_U8:
                 {
                     vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)ref->data.y + y * ref->stride * elem_size + x * elem_size);
@@ -3471,6 +3814,17 @@
             {
                 switch (arg_->format)
                 {
+                case VX_DF_IMAGE_U1:
+                {
+                    vx_uint8  offset  = x % 8;
+                    vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)ref->data.y + y * ct_stride_bytes(ref) +
+                                                    (x * ct_image_bits_per_pixel(VX_DF_IMAGE_U1)) / 8);
+                    vx_uint8* tst_ptr = (vx_uint8*)vxFormatImagePatchAddress2d(ptr, x, y, &tst_addr);
+                    ASSERT_EQ_INT(( ref_ptr[0] & (1 << offset)) >> offset,
+                                  (~tst_ptr[0] & (1 << offset)) >> offset);
+                }
+                break;
+
                 case VX_DF_IMAGE_U8:
                 {
                     vx_uint8* ref_ptr = (vx_uint8*)((vx_uint8*)ref->data.y + y * ref->stride * elem_size + x * elem_size);
@@ -3602,310 +3956,9 @@
     return;
 } /* testMapWriteRandomImage() */
 
-
-/* ***************************************************************************
-//  vxCreateImageFromChannel tests
-*/
-TESTCASE(vxCreateImageFromChannel, CT_VXContext, ct_setup_vx_context, 0)
-
-typedef struct
-{
-    const char*      testName;
-    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
-    const char*      fileName;
-    int              width;
-    int              height;
-    vx_df_image      format;
-    vx_enum          channel;
-
-} CreateImageFromChannel_Arg;
-
-
-#define ADD_IMAGE_FORMAT_444(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_YUV4", __VA_ARGS__, VX_DF_IMAGE_YUV4))
-
-#define ADD_IMAGE_FORMAT_420(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_IYUV", __VA_ARGS__, VX_DF_IMAGE_IYUV)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV12", __VA_ARGS__, VX_DF_IMAGE_NV12)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_NV21", __VA_ARGS__, VX_DF_IMAGE_NV21))
-
-#define ADD_IMAGE_CHANNEL_YUV(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_Y", __VA_ARGS__, VX_CHANNEL_Y)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_U", __VA_ARGS__, VX_CHANNEL_U)), \
-    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_V", __VA_ARGS__, VX_CHANNEL_V))
-
-#define ADD_IMAGE_CHANNEL_Y(testArgName, nextmacro, ...) \
-    CT_EXPAND(nextmacro(testArgName "/VX_CHANNEL_Y", __VA_ARGS__, VX_CHANNEL_Y))
-
-#undef PARAMETERS
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_444, ADD_IMAGE_CHANNEL_YUV, ARG, NULL, NULL), \
-    CT_GENERATE_PARAMETERS("uniform", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_420, ADD_IMAGE_CHANNEL_Y, ARG, NULL, NULL)
-
-
-TEST_WITH_ARG(vxCreateImageFromChannel, testChannelFromUniformImage, CreateImageFromChannel_Arg, PARAMETERS)
-{
-    vx_context context = context_->vx_context_;
-    vx_image src = 0;
-    vx_image ref = 0;
-    vx_image tst = 0;
-    vx_uint32 width  = arg_->width;
-    vx_uint32 height = arg_->height;
-    vx_pixel_value_t pixel_value;
-
-    pixel_value.YUV[0] = 0x55;
-    pixel_value.YUV[1] = 0xAA;
-    pixel_value.YUV[2] = 0x33;
-
-    EXPECT_VX_OBJECT(src = vxCreateUniformImage(context, arg_->width, arg_->height, arg_->format, &pixel_value), VX_TYPE_IMAGE);
-
-    if (VX_CHANNEL_Y != arg_->channel && VX_DF_IMAGE_IYUV == arg_->format)
-    {
-        width  /= 2;
-        height /= 2;
-    }
-
-    EXPECT_VX_OBJECT(ref = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-    VX_CALL(vxuChannelExtract(context, src, arg_->channel, ref));
-
-    EXPECT_VX_OBJECT(tst = vxCreateImageFromChannel(src, arg_->channel), VX_TYPE_IMAGE);
-
-    {
-        CT_Image image_ref = ct_image_from_vx_image(ref);
-        CT_Image image_tst = ct_image_from_vx_image(tst);
-
-        EXPECT_EQ_CTIMAGE(image_ref, image_tst);
-    }
-
-    VX_CALL(vxReleaseImage(&ref));
-    VX_CALL(vxReleaseImage(&tst));
-    VX_CALL(vxReleaseImage(&src));
-}
-
-#undef PARAMETERS
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_444, ADD_IMAGE_CHANNEL_YUV, ARG, own_generate_rand_image, NULL), \
-    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_420, ADD_IMAGE_CHANNEL_Y, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(vxCreateImageFromChannel, testChannelFromRandomImage, CreateImageFromChannel_Arg, PARAMETERS)
-{
-    vx_context context = context_->vx_context_;
-    vx_image src = 0;
-    vx_image ref = 0;
-    vx_image tst = 0;
-    vx_uint32 width  = arg_->width;
-    vx_uint32 height = arg_->height;
-    CT_Image image = NULL;
-
-    ASSERT_NO_FAILURE(image = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
-
-    EXPECT_VX_OBJECT(src = ct_image_to_vx_image(image, context), VX_TYPE_IMAGE);
-
-    if (VX_CHANNEL_Y != arg_->channel && VX_DF_IMAGE_IYUV == arg_->format)
-    {
-        width  /= 2;
-        height /= 2;
-    }
-
-    EXPECT_VX_OBJECT(ref = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-    VX_CALL(vxuChannelExtract(context, src, arg_->channel, ref));
-
-    EXPECT_VX_OBJECT(tst = vxCreateImageFromChannel(src, arg_->channel), VX_TYPE_IMAGE);
-
-    {
-        /* 1. check if image created from channel is equal to channel extracted from image */
-        CT_Image image_ref = ct_image_from_vx_image(ref);
-        CT_Image image_tst = ct_image_from_vx_image(tst);
-
-        EXPECT_EQ_CTIMAGE(image_ref, image_tst);
-    }
-
-    {
-        /* 2. check if modification of image created from channel reflected into channel of original image */
-        vx_uint32 i;
-        vx_uint32 j;
-        vx_uint32 p = (VX_CHANNEL_Y == arg_->channel ? 0 : (VX_CHANNEL_U == arg_->channel ? 1 : 2));
-        vx_rectangle_t rect = { 1, 1, 6, 6 };
-        vx_imagepatch_addressing_t addr =
-        {
-            rect.end_x - rect.start_x,
-            rect.end_y - rect.start_y,
-            1,
-            rect.end_x - rect.start_x
-        };
-
-        vx_size sz = 0;
-        void* ptr = 0;
-
-        sz = vxComputeImagePatchSize(tst, &rect, 0);
-
-        ptr = ct_alloc_mem(sz);
-
-        /* fill image patch with some values */
-        for (i = 0; i < addr.dim_y; i++)
-        {
-            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
-            for (j = 0; j < addr.dim_x; j++)
-            {
-                p[j] = (vx_uint8)(i + j);
-            }
-        }
-
-        /* copy patch to channel image */
-        vxCopyImagePatch(tst, &rect, 0, &addr, ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
-
-        /* clean patch memory */
-        ct_memset(ptr, 0, sz);
-
-        /* get channel patch from original image */
-        vxCopyImagePatch(src, &rect, p, &addr, ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
-
-        /* check channel changes has been reflected into original image */
-        for (i = 0; i < addr.dim_y; i++)
-        {
-            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
-            for (j = 0; j < addr.dim_x; j++)
-            {
-                EXPECT_EQ_INT((vx_uint8)(i + j), p[j]);
-            }
-        }
-
-        ct_free_mem(ptr);
-    }
-
-    {
-        /* 3. check if modification of channel in original image reflected into image created from channel */
-        vx_uint32 i;
-        vx_uint32 j;
-        vx_uint32 p = (VX_CHANNEL_Y == arg_->channel ? 0 : (VX_CHANNEL_U == arg_->channel ? 1 : 2));
-        vx_rectangle_t rect = { 1, 1, 6, 6 };
-        vx_imagepatch_addressing_t addr =
-        {
-            rect.end_x - rect.start_x,
-            rect.end_y - rect.start_y,
-            1,
-            rect.end_x - rect.start_x
-        };
-
-        vx_size sz = 0;
-        void* ptr = 0;
-
-        sz = vxComputeImagePatchSize(src, &rect, p);
-
-        ptr = ct_alloc_mem(sz);
-
-        /* fill image patch with some values */
-        for (i = 0; i < addr.dim_y; i++)
-        {
-            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
-            for (j = 0; j < addr.dim_x; j++)
-            {
-                p[j] = (vx_uint8)(i + j);
-            }
-        }
-
-        /* copy patch to channel of original image */
-        vxCopyImagePatch(src, &rect, p, &addr, ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
-
-        /* clean patch memory */
-        ct_memset(ptr, 0, sz);
-
-        /* get patch from image created from channel */
-        vxCopyImagePatch(tst, &rect, 0, &addr, ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
-
-        /* check changes of channel in original image has been reflected into channel image */
-        for (i = 0; i < addr.dim_y; i++)
-        {
-            vx_uint8* p = (vx_uint8*)ptr + i * addr.stride_x;
-            for (j = 0; j < addr.dim_x; j++)
-            {
-                EXPECT_EQ_INT((vx_uint8)(i + j), p[j]);
-            }
-        }
-
-        ct_free_mem(ptr);
-    }
-
-    VX_CALL(vxReleaseImage(&ref));
-    VX_CALL(vxReleaseImage(&tst));
-    VX_CALL(vxReleaseImage(&src));
-}
-
-#undef PARAMETERS
-#define PARAMETERS \
-    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_444, ADD_IMAGE_CHANNEL_YUV, ARG, own_generate_rand_image, NULL), \
-    CT_GENERATE_PARAMETERS("rand", ADD_SIZE_SMALL_SET, ADD_IMAGE_FORMAT_420, ADD_IMAGE_CHANNEL_Y, ARG, own_generate_rand_image, NULL)
-
-TEST_WITH_ARG(vxCreateImageFromChannel, testChannelFromHandle, CreateImageFromChannel_Arg, PARAMETERS)
-{
-    vx_context context = context_->vx_context_;
-    vx_image src = 0;
-    vx_image ref = 0;
-    vx_image tst = 0;
-
-    vx_uint32 width  = arg_->width;
-    vx_uint32 height = arg_->height;
-
-    CT_Image image = NULL;
-
-    ASSERT_NO_FAILURE(image = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
-
-    {
-        vx_uint32 n;
-        vx_uint32 nplanes;
-
-        vx_enum channel[VX_PLANE_MAX] = { VX_CHANNEL_Y, VX_CHANNEL_U, VX_CHANNEL_V, 0 };
-
-        vx_imagepatch_addressing_t addr[VX_PLANE_MAX] =
-        {
-            VX_IMAGEPATCH_ADDR_INIT,
-            VX_IMAGEPATCH_ADDR_INIT,
-            VX_IMAGEPATCH_ADDR_INIT,
-            VX_IMAGEPATCH_ADDR_INIT
-        };
-        void* ptrs[VX_PLANE_MAX] = { 0, 0, 0, 0 };
-
-        ASSERT_NO_FAILURE(nplanes = ct_get_num_planes(arg_->format));
-
-        for (n = 0; n < nplanes; n++)
-        {
-            addr[n].dim_x    = image->width  / ct_image_get_channel_subsampling_x(image, channel[n]);
-            addr[n].dim_y    = image->height / ct_image_get_channel_subsampling_y(image, channel[n]);
-            addr[n].stride_x = ct_image_get_channel_step_x(image, channel[n]);
-            addr[n].stride_y = ct_image_get_channel_step_y(image, channel[n]);
-
-            ptrs[n] = ct_image_get_plane_base(image, n);
-        }
-
-        EXPECT_VX_OBJECT(src = vxCreateImageFromHandle(context, arg_->format, addr, ptrs, VX_MEMORY_TYPE_HOST), VX_TYPE_IMAGE);
-    }
-
-    if (VX_CHANNEL_Y != arg_->channel && VX_DF_IMAGE_IYUV == arg_->format)
-    {
-        width  /= 2;
-        height /= 2;
-    }
-
-    EXPECT_VX_OBJECT(ref = vxCreateImage(context, width, height, VX_DF_IMAGE_U8), VX_TYPE_IMAGE);
-    VX_CALL(vxuChannelExtract(context, src, arg_->channel, ref));
-
-    EXPECT_VX_OBJECT(tst = vxCreateImageFromChannel(src, arg_->channel), VX_TYPE_IMAGE);
-
-    {
-        CT_Image image_ref = ct_image_from_vx_image(ref);
-        CT_Image image_tst = ct_image_from_vx_image(tst);
-
-        EXPECT_EQ_CTIMAGE(image_ref, image_tst);
-    }
-
-    VX_CALL(vxReleaseImage(&ref));
-    VX_CALL(vxReleaseImage(&tst));
-    VX_CALL(vxReleaseImage(&src));
-}
-
-
 TESTCASE_TESTS(Image,
     testRngImageCreation,
+    testImageCreation_U1,
     testVirtualImageCreation,
     testVirtualImageCreationDims,
     testCreateImageFromHandle,
@@ -3914,26 +3967,29 @@
     testConvert_CT_Image,
     testvxSetImagePixelValues,
     testUniformImage,
-    testComputeImagePatchSize,
     DISABLED_testAccessCopyWrite,
     DISABLED_testAccessCopyRead,
     DISABLED_testAccessCopyWriteUniformImage,
     testQueryImage
-    )
+)
+
+TESTCASE_TESTS(vxCreateImageFromChannel,
+    testChannelFromUniformImage,
+    testChannelFromRandomImage,
+    testChannelFromHandle
+)
 
 TESTCASE_TESTS(vxCopyImagePatch,
     testReadUniformImage,
     testReadRandomImage,
-    testWriteRandomImage)
+    testWriteRandomImage
+)
 
 TESTCASE_TESTS(vxMapImagePatch,
     testMapReadUniformImage,
     testMapReadRandomImage,
     testMapReadWriteRandomImage,
-    testMapWriteRandomImage)
+    testMapWriteRandomImage
+)
 
-TESTCASE_TESTS(vxCreateImageFromChannel,
-    testChannelFromUniformImage,
-    testChannelFromRandomImage,
-    testChannelFromHandle)
-
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_vxtensor.c b/test_conformance/test_vxtensor.c
new file mode 100644
index 0000000..ab657d9
--- /dev/null
+++ b/test_conformance/test_vxtensor.c
@@ -0,0 +1,665 @@
+/*
+
+* Copyright (c) 2012-2017 The Khronos Group Inc.
+*
+* 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.
+*/
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_NEURAL_NETWORKS || OPENVX_CONFORMANCE_NNEF_IMPORT
+
+#include <string.h>
+#include <VX/vx.h>
+#include <VX/vxu.h>
+
+#include "test_engine/test.h"
+#include "test_tensor_util.h"
+
+/* ***************************************************************************
+//  Tensor tests
+*/
+TESTCASE(Tensor, CT_VXContext, ct_setup_vx_context, 0)
+
+typedef struct
+{
+    const char * name;
+
+    enum TestTensorDF fmt;
+} test_tensor_arg;
+
+TEST_WITH_ARG(Tensor, testvxCreateTensorFromHandle, test_tensor_arg,
+    ARG("Q78_vxCreateTensorFromHandle", TT_Q78),
+    ARG("U8_vxCreateTensorFromHandle", TT_U8),
+    ARG("S8_vxCreateTensorFromHandle", TT_S8),
+    )
+{
+    const vx_context context = context_->vx_context_;
+
+    const enum TestTensorDF fmt = arg_->fmt;
+    assert(fmt == TT_Q78 || fmt == TT_U8 || fmt == TT_S8);
+
+    vx_size max_dims = 0;
+    {   // TODO: ownTestGetMaxDims() ?
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if (!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position= 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    size_t * const tensor_strides = ct_alloc_mem(sizeof(*tensor_strides) * max_dims);
+    ASSERT(tensor_dims && tensor_strides);
+
+    void * ptr = NULL;
+
+    for (vx_size dims = 1; dims <= max_dims; ++dims)
+    {
+        for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
+        {
+            for (vx_size i = 0; i < dims; ++i)
+            {
+                tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+
+                tensor_strides[i] = i ? tensor_strides[i - 1] * tensor_dims[i - 1] : sizeof_data_type;
+            }
+
+            vx_tensor src_tensor = vxCreateTensor(context, dims, tensor_dims, data_type, fixed_point_position);
+            ASSERT_VX_OBJECT(src_tensor, VX_TYPE_TENSOR);
+            vx_tensor dst_tensor = vxCreateTensorFromHandle(context, dims, tensor_dims, data_type, fixed_point_position,
+                tensor_strides, ptr, VX_MEMORY_TYPE_HOST);
+            ASSERT_VX_OBJECT(dst_tensor, VX_TYPE_TENSOR);
+
+            //check
+            vx_size src_check_size, dst_check_size;
+            void *src_check_ptr = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+            void *dst_check_ptr = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+
+            //VX_TENSOR_NUMBER_OF_DIMS
+            src_check_size = dst_check_size = sizeof(vx_size);
+            vxQueryTensor(src_tensor, VX_TENSOR_NUMBER_OF_DIMS, src_check_ptr, src_check_size);
+            vxQueryTensor(dst_tensor, VX_TENSOR_NUMBER_OF_DIMS, dst_check_ptr, dst_check_size);
+            EXPECT_EQ_INT((*(vx_size *)src_check_ptr), (*(vx_size *)dst_check_ptr));
+
+            //VX_TENSOR_DIMS
+            src_check_size = dst_check_size = sizeof(vx_size) * dims;
+            vxQueryTensor(src_tensor, VX_TENSOR_DIMS, src_check_ptr, src_check_size);
+            vxQueryTensor(dst_tensor, VX_TENSOR_DIMS, dst_check_ptr, dst_check_size);
+            EXPECT_EQ_INT((*(vx_size *)src_check_ptr), (*(vx_size *)dst_check_ptr));
+
+            //VX_TENSOR_DATA_TYPE
+            src_check_size = dst_check_size = sizeof(vx_enum);
+            vxQueryTensor(src_tensor, VX_TENSOR_DATA_TYPE, src_check_ptr, src_check_size);
+            vxQueryTensor(dst_tensor, VX_TENSOR_DATA_TYPE, dst_check_ptr, dst_check_size);
+            EXPECT_EQ_INT((*(vx_enum *)src_check_ptr), (*(vx_enum *)dst_check_ptr));
+
+            //VX_TENSOR_FIXED_POINT_POSITION
+            src_check_size = dst_check_size = sizeof(vx_int8);
+            vxQueryTensor(src_tensor, VX_TENSOR_FIXED_POINT_POSITION, src_check_ptr, src_check_size);
+            vxQueryTensor(dst_tensor, VX_TENSOR_FIXED_POINT_POSITION, dst_check_ptr, dst_check_size);
+            EXPECT_EQ_INT((*(vx_int8 *)src_check_ptr), (*(vx_int8 *)dst_check_ptr));
+
+            ct_free_mem(src_check_ptr);
+            ct_free_mem(dst_check_ptr);
+
+            VX_CALL(vxReleaseTensor(&src_tensor));
+            VX_CALL(vxReleaseTensor(&dst_tensor));
+
+            EXPECT_EQ_PTR(NULL, src_tensor);
+            EXPECT_EQ_PTR(NULL, dst_tensor);
+        }
+    }
+
+    ct_free_mem(tensor_dims);
+    ct_free_mem(tensor_strides);
+}
+
+TEST_WITH_ARG(Tensor, testvxSwapTensorHandle, test_tensor_arg,
+    ARG("Q78_vxSwapTensorHandle", TT_Q78),
+    ARG("U8_vxSwapTensorHandle", TT_U8),
+    ARG("S8_vxSwapTensorHandle", TT_S8),
+    )
+{
+    const vx_context context = context_->vx_context_;
+
+    vx_status ret;
+
+    const enum TestTensorDF fmt = arg_->fmt;
+    assert(fmt == TT_Q78 || fmt == TT_U8 || fmt == TT_S8);
+
+    vx_size max_dims = 0;
+    {
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if (!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    uint64_t rng2;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng2, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    size_t * const in0_dims = ct_alloc_mem(sizeof(*in0_dims) * max_dims);
+    ASSERT(in0_dims);
+
+    size_t * const in0_strides = ct_alloc_mem(sizeof(*in0_strides) * max_dims);
+    ASSERT(in0_strides);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        in0_dims[i] = CLAMP(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ / 2);
+        in0_strides[i] = i ? in0_strides[i - 1] * in0_dims[i - 1] : sizeof_data_type;
+    }
+
+    vx_tensor in0_tensor = vxCreateTensor(context, max_dims, in0_dims, data_type, fixed_point_position);
+    vx_tensor in1_tensor = vxCreateTensor(context, max_dims, in0_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in0_tensor, VX_TYPE_TENSOR);
+    ASSERT_VX_OBJECT(in1_tensor, VX_TYPE_TENSOR);
+
+    size_t in0_bytes = 1;
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        in0_bytes *= in0_dims[i];
+    }
+    size_t malloc_bytes = in0_bytes * sizeof_data_type;
+
+    void * in0_data = ct_alloc_mem(malloc_bytes);
+    void * in1_data = ct_alloc_mem(malloc_bytes);
+    void * out0_data = ct_alloc_mem(malloc_bytes);
+    void * out1_data = ct_alloc_mem(malloc_bytes);
+    ASSERT(in0_data && in1_data && out0_data &&out1_data);
+
+    {
+        ownFillRandData(fmt, &rng, in0_bytes, in0_data);
+        ownFillRandData(fmt, &rng2, in0_bytes, in1_data);
+
+        vx_size view_start[MAX_TENSOR_DIMS] = { 0 };
+        ret = vxCopyTensorPatch(in0_tensor, max_dims, view_start, in0_dims, in0_strides, in0_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+        EXPECT_EQ_VX_STATUS(VX_SUCCESS, ret);
+        ret = vxCopyTensorPatch(in1_tensor, max_dims, view_start, in0_dims, in0_strides, in1_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+        EXPECT_EQ_VX_STATUS(VX_SUCCESS, ret);
+    }
+
+    //SWAP
+    void* prev_ptrs[6] = { 0, 0, 0, 0, 0, 0 };
+    ret = vxSwapTensorHandle(in0_tensor, in1_data, prev_ptrs);
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, ret);
+
+    {
+        const size_t view_start[MAX_TENSOR_DIMS] = { 0 };
+        VX_CALL(vxCopyTensorPatch(in0_tensor, max_dims, view_start, in0_dims, in0_strides, out0_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+        VX_CALL(vxCopyTensorPatch(in1_tensor, max_dims, view_start, in0_dims, in0_strides, out1_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+
+        // Verify the results for new_ptr
+        for (size_t index = 0; index < in0_bytes; ++index)
+        {
+            size_t out_byte_offset = 0;
+            vx_size index_leftover = index;
+            int divisor = 1;
+            for (vx_size i = 0; i < max_dims; i++)
+            {
+                divisor = (vx_uint32)(in0_dims[i]);
+                vx_size curr_dim_index = index_leftover%divisor;
+                out_byte_offset += in0_strides[i] * (curr_dim_index);
+                index_leftover = index_leftover / divisor;
+            }
+
+            const char * out_b_ptr = (char*)out0_data + out_byte_offset;
+            const char * ref_b_ptr = (char*)out1_data + out_byte_offset;
+
+            switch (fmt)
+            {
+            case TT_Q78:
+                {
+                    const vx_int16 out = *(vx_int16*)out_b_ptr;
+                    int16_t ref = *(vx_int16*)ref_b_ptr;
+                    EXPECT_EQ_INT(ref, out);
+                    break;
+                }
+            case TT_U8:
+                {
+                    const vx_uint8 out = *(vx_uint8*)out_b_ptr;
+                    const uint8_t ref = *(vx_uint8*)ref_b_ptr;
+                    EXPECT_EQ_INT(ref, out);
+                    break;
+                }
+            case TT_S8:
+                {
+                    const vx_int8 out = *(vx_int8*)out_b_ptr;
+                    const vx_int8 ref = *(vx_int8*)ref_b_ptr;
+                    EXPECT_EQ_INT(ref, out);
+                    break;
+                }
+            default: assert(0);
+            }
+        }
+
+        //verify the result for prev_ptr
+        vx_tensor tmp = vxCreateTensorFromHandle(context, max_dims, in0_dims, data_type, fixed_point_position, in0_strides, *prev_ptrs, VX_MEMORY_TYPE_HOST);
+        VX_CALL(vxCopyTensorPatch(tmp, max_dims, view_start, in0_dims, in0_strides, out1_data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
+        for (size_t index = 0; index < in0_bytes; ++index)
+        {
+            size_t out_byte_offset = 0;
+            vx_size index_leftover = index;
+            int divisor = 1;
+            for (vx_size i = 0; i < max_dims; i++)
+            {
+                divisor = (vx_uint32)(in0_dims[i]);
+                vx_size curr_dim_index = index_leftover%divisor;
+                out_byte_offset += in0_strides[i] * (curr_dim_index);
+                index_leftover = index_leftover / divisor;
+            }
+            const char * out_b_ptr = (char*)out1_data + out_byte_offset;
+            const char * ref_b_ptr = (char*)in0_data + out_byte_offset;
+
+            switch (fmt)
+            {
+            case TT_Q78:
+            {
+                const vx_int16 out = *(vx_int16*)out_b_ptr;
+                int16_t ref = *(vx_int16*)ref_b_ptr;
+                EXPECT_EQ_INT(ref, out);
+                break;
+            }
+            case TT_U8:
+            {
+                const vx_uint8 out = *(vx_uint8*)out_b_ptr;
+                const uint8_t ref = *(vx_uint8*)ref_b_ptr;
+                EXPECT_EQ_INT(ref, out);
+                break;
+            }
+            case TT_S8:
+            {
+                const vx_int8 out = *(vx_int8*)out_b_ptr;
+                const vx_int8 ref = *(vx_int8*)ref_b_ptr;
+                EXPECT_EQ_INT(ref, out);
+                break;
+            }
+            default: assert(0);
+            }
+        }
+
+        VX_CALL(vxReleaseTensor(&tmp));
+        EXPECT_EQ_PTR(NULL, tmp);
+    }
+
+    VX_CALL(vxReleaseTensor(&in0_tensor));
+    VX_CALL(vxReleaseTensor(&in1_tensor));
+    EXPECT_EQ_PTR(NULL, in0_tensor);
+    EXPECT_EQ_PTR(NULL, in1_tensor);
+
+    ct_free_mem(in0_data);
+    //No need free in1_data, as free by vxReleaseTensor(&in0_tensor)
+    ct_free_mem(out0_data);
+    ct_free_mem(out1_data);
+
+    ct_free_mem(in0_dims);
+    ct_free_mem(in0_strides);
+}
+
+TEST_WITH_ARG(Tensor, testMapandUnMapTensorPatch, test_tensor_arg,
+    ARG("Q78_testMapandUnMapTensorPatch", TT_Q78),
+    ARG("U8_testMapandUnMapTensorPatch", TT_U8),
+    ARG("S8_testMapandUnMapTensorPatch", TT_S8),
+    )
+{
+    const vx_context context = context_->vx_context_;
+
+    vx_status ret;
+
+    const enum TestTensorDF fmt = arg_->fmt;
+    assert(fmt == TT_Q78 || fmt == TT_U8 || fmt == TT_S8);
+
+    vx_size max_dims = 0;
+    {
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if (!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    size_t * const in0_dims = ct_alloc_mem(sizeof(*in0_dims) * max_dims);
+    ASSERT(in0_dims);
+
+    size_t * const in0_strides = ct_alloc_mem(sizeof(*in0_strides) * max_dims);
+    ASSERT(in0_strides);
+
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        in0_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+        in0_strides[i] = i ? in0_strides[i - 1] * in0_dims[i - 1] : sizeof_data_type;
+    }
+
+    vx_tensor in0_tensor = vxCreateTensor(context, max_dims, in0_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in0_tensor, VX_TYPE_TENSOR);
+
+    size_t in0_bytes = 1;
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        in0_bytes *= in0_dims[i];
+    }
+    size_t malloc_bytes = in0_bytes * sizeof_data_type;
+
+    void * in0_data = ct_alloc_mem(malloc_bytes);
+    ASSERT(in0_data);
+    //init in0_data
+    ownFillRandData(fmt, &rng, in0_bytes, in0_data);
+    vx_size view_start[MAX_TENSOR_DIMS] = { 0 };
+    ret = vxCopyTensorPatch(in0_tensor, max_dims, view_start, in0_dims, in0_strides, in0_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST);
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, ret);
+
+    vx_map_id map_id;
+    void* plane_ptr = 0;
+
+    ret = vxMapTensorPatch(in0_tensor, max_dims, view_start, in0_dims,
+        &map_id, in0_strides, &plane_ptr, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, ret);
+
+    for (size_t index = 0; index < in0_bytes; ++index)
+    {
+        const char * out_b_ptr = (char*)plane_ptr + index;
+        const char * ref_b_ptr = (char*)in0_data + index;
+
+        switch (fmt)
+        {
+        case TT_Q78:
+        {
+            const vx_int16 out = *(vx_int16*)out_b_ptr;
+            int16_t ref = *(vx_int16*)ref_b_ptr;
+            EXPECT_EQ_INT(ref, out);
+            break;
+        }
+        case TT_U8:
+        {
+            const vx_uint8 out = *(vx_uint8*)out_b_ptr;
+            const uint8_t ref = *(vx_uint8*)ref_b_ptr;
+            EXPECT_EQ_INT(ref, out);
+            break;
+        }
+        case TT_S8:
+        {
+            const vx_int8 out = *(vx_int8*)out_b_ptr;
+            const vx_int8 ref = *(vx_int8*)ref_b_ptr;
+            EXPECT_EQ_INT(ref, out);
+            break;
+        }
+        default: assert(0);
+        }
+    }
+
+    ret = vxUnmapTensorPatch(in0_tensor, map_id);
+    EXPECT_EQ_VX_STATUS(VX_SUCCESS, ret);
+
+    VX_CALL(vxReleaseTensor(&in0_tensor));
+    EXPECT_EQ_PTR(NULL, in0_tensor);
+
+    ct_free_mem(in0_data);
+    ct_free_mem(in0_dims);
+    ct_free_mem(in0_strides);
+}
+
+TEST_WITH_ARG(Tensor, testvxCreateVirtualTensor, test_tensor_arg,
+    ARG("Q78_vxCreateVirtualTensor", TT_Q78),
+    ARG("U8_vxCreateVirtualTensor", TT_U8),
+    ARG("S8_vxCreateVirtualTensor", TT_S8),
+    )
+{
+    const vx_context context = context_->vx_context_;
+
+    const enum TestTensorDF fmt = arg_->fmt;
+    assert(fmt == TT_Q78 || fmt == TT_U8 || fmt == TT_S8);
+
+    vx_size max_dims = 0;
+    {   // TODO: ownTestGetMaxDims() ?
+        VX_CALL(vxQueryContext(context, VX_CONTEXT_MAX_TENSOR_DIMS, &max_dims, sizeof(max_dims)));
+        ASSERT(max_dims > 3);
+        if (!DEBUG_TEST_TENSOR_BEYOND_FOUR_DIMS) max_dims = 4; else max_dims = MIN(max_dims, MAX_TENSOR_DIMS);
+    }
+
+    uint64_t rng;
+    {   // TODO: ownTestGetRNG() ?
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    size_t * const tensor_dims = ct_alloc_mem(sizeof(*tensor_dims) * max_dims);
+    ASSERT(tensor_dims);
+
+    for (vx_size dims = 1; dims <= max_dims; ++dims)
+    {
+        for (int iter = 0; iter < TEST_TENSOR_NUM_ITERATIONS; ++iter)
+        {
+            for (vx_size i = 0; i < dims; ++i)
+            {
+                tensor_dims[i] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+            }
+
+            vx_graph graph = vxCreateGraph(context);
+            ASSERT_VX_OBJECT(graph, VX_TYPE_GRAPH);
+            vx_tensor src_tensor = vxCreateVirtualTensor(graph, dims, tensor_dims, data_type, fixed_point_position);
+            ASSERT_VX_OBJECT(src_tensor, VX_TYPE_TENSOR);
+
+            //check
+            vx_size src_check_size = 0;
+            vx_size expect_num_of_dims = 0;
+            vx_enum expect_data_type = 0;
+            vx_int8 expect_fixed_point_position = 0;
+            size_t *src_check_ptr = ct_alloc_mem(sizeof(size_t) * max_dims);
+
+            //VX_TENSOR_NUMBER_OF_DIMS
+            src_check_size = sizeof(vx_size);
+            vxQueryTensor(src_tensor, VX_TENSOR_NUMBER_OF_DIMS, (void *)(&(expect_num_of_dims)), src_check_size);
+            EXPECT_EQ_INT(expect_num_of_dims, dims);
+
+            //VX_TENSOR_DIMS
+            src_check_size = sizeof(vx_size) * dims;
+            vxQueryTensor(src_tensor, VX_TENSOR_DIMS, (void *)src_check_ptr, src_check_size);
+            for (int tmpIdx = 0; tmpIdx < dims; tmpIdx++)
+            {
+                EXPECT_EQ_INT(src_check_ptr[tmpIdx], tensor_dims[tmpIdx]);
+            }
+
+            //VX_TENSOR_DATA_TYPE
+            src_check_size = sizeof(vx_enum);
+            vxQueryTensor(src_tensor, VX_TENSOR_DATA_TYPE, &expect_data_type, sizeof(vx_enum));
+            EXPECT_EQ_INT(expect_data_type, data_type);
+
+            //VX_TENSOR_FIXED_POINT_POSITION
+            src_check_size = sizeof(vx_int8);
+            vxQueryTensor(src_tensor, VX_TENSOR_FIXED_POINT_POSITION, &expect_fixed_point_position, src_check_size);
+            EXPECT_EQ_INT(expect_fixed_point_position, fixed_point_position);
+
+            ct_free_mem(src_check_ptr);
+
+            VX_CALL(vxReleaseTensor(&src_tensor));
+            VX_CALL(vxReleaseGraph(&graph));
+
+            EXPECT_EQ_PTR(NULL, src_tensor);
+            EXPECT_EQ_PTR(NULL, graph);
+        }
+    }
+
+    ct_free_mem(tensor_dims);
+}
+#endif
+
+#ifdef OPENVX_USE_ENHANCED_VISION
+/* ***************************************************************************
+ Test enhanced tensor interface:
+         vxCreateImageObjectArrayFromTensor
+*****************************************************************************/
+TESTCASE(TensorEnhanced, CT_VXContext, ct_setup_vx_context, 0)
+
+typedef struct
+{
+    const char * name;
+    int width, height;
+    enum TestTensorDF fmt;
+} test_create_image_objectarray_tensor_arg;
+
+#define TENSOR_FORMAT(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/fmt=Q78", __VA_ARGS__, TT_Q78)), \
+    CT_EXPAND(nextmacro(testArgName "/fmt=U8", __VA_ARGS__, TT_U8))
+
+
+#define CREATE_IMAGE_OBJECTARRAY_FROM_TENSOR_PARAMETERS \
+    CT_GENERATE_PARAMETERS("Adjacent2D", ADD_SIZE_SMALL_SET, TENSOR_FORMAT, ARG)
+
+TEST_WITH_ARG(TensorEnhanced, testvxCreateImageObjectArrayFromTensor,
+              test_create_image_objectarray_tensor_arg,
+              CREATE_IMAGE_OBJECTARRAY_FROM_TENSOR_PARAMETERS
+    )
+{
+    const vx_context context = context_->vx_context_;
+    const enum TestTensorDF fmt = arg_->fmt;
+    assert(fmt == TT_Q78 || fmt == TT_U8 );
+    vx_rectangle_t rect;
+    vx_size array_size;
+    vx_size stride;
+    vx_df_image image_format = VX_DF_IMAGE_U8;
+    vx_object_array objImgs = 0;
+    vx_size view_start[3] = {0};
+
+    vx_size max_dims = 3;
+    vx_size dim1 = arg_->height;
+    vx_size dim0 = arg_->width;
+
+    rect.start_x = 0;
+    rect.end_x = arg_->width;
+    rect.start_y = 0;
+    rect.end_y = arg_->height;
+
+    uint64_t rng;
+    {
+        uint64_t * seed = &CT()->seed_;
+        ASSERT(!!seed);
+        CT_RNG_INIT(rng, *seed);
+    }
+
+    vx_enum data_type = 0;
+    vx_uint8 fixed_point_position = 0;
+    vx_size sizeof_data_type = 0;
+    ownUnpackFormat(fmt, &data_type, &fixed_point_position, &sizeof_data_type);
+
+    size_t * const in0_dims = ct_alloc_mem(sizeof(*in0_dims) * max_dims);
+    ASSERT(in0_dims);
+
+    size_t * const in0_strides = ct_alloc_mem(sizeof(*in0_strides) * max_dims);
+    ASSERT(in0_strides);
+
+    in0_dims[2] = (size_t)CT_RNG_NEXT_INT(rng, TEST_TENSOR_MIN_DIM_SZ, TEST_TENSOR_MAX_DIM_SZ + 1);
+    in0_dims[0] = dim0;
+    in0_dims[1] = dim1;
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        in0_strides[i] = i ? in0_strides[i - 1] * in0_dims[i - 1] : sizeof_data_type;
+    }
+
+    vx_tensor in0_tensor = vxCreateTensor(context, max_dims, in0_dims, data_type, fixed_point_position);
+    ASSERT_VX_OBJECT(in0_tensor, VX_TYPE_TENSOR);
+
+    size_t in0_bytes = 1;
+    for (vx_size i = 0; i < max_dims; ++i)
+    {
+        in0_bytes *= in0_dims[i];
+    }
+    size_t malloc_bytes = in0_bytes * sizeof_data_type;
+
+    void * in0_data = ct_alloc_mem(malloc_bytes);
+    ASSERT(in0_data);
+    //init in0_data
+    ownFillRandData(fmt, &rng, in0_bytes, in0_data);
+    VX_CALL(vxCopyTensorPatch(in0_tensor, max_dims, view_start, in0_dims, in0_strides, in0_data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
+
+    array_size = in0_dims[2];
+    stride = in0_strides[2];
+    if (fmt == TT_Q78)
+    {
+        image_format = VX_DF_IMAGE_S16;
+    }
+    ASSERT_VX_OBJECT(objImgs = vxCreateImageObjectArrayFromTensor(in0_tensor, &rect, array_size, stride, image_format),
+        VX_TYPE_OBJECT_ARRAY);
+
+    //check result
+    vx_size expect_itemnums = 0;
+    VX_CALL(vxQueryObjectArray(objImgs, VX_OBJECT_ARRAY_NUMITEMS, (void *)&expect_itemnums, sizeof(expect_itemnums)));
+    EXPECT_EQ_INT(expect_itemnums, array_size);
+
+    VX_CALL(vxReleaseObjectArray(&objImgs));
+    EXPECT_EQ_PTR(NULL, objImgs);
+
+    VX_CALL(vxReleaseTensor(&in0_tensor));
+    EXPECT_EQ_PTR(NULL, in0_tensor);
+
+    ct_free_mem(in0_data);
+    ct_free_mem(in0_dims);
+    ct_free_mem(in0_strides);
+}
+
+#endif
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_NEURAL_NETWORKS || OPENVX_CONFORMANCE_NNEF_IMPORT
+
+TESTCASE_TESTS(Tensor,
+    testvxCreateTensorFromHandle,
+    testvxSwapTensorHandle,
+    testMapandUnMapTensorPatch,
+    testvxCreateVirtualTensor)
+
+#endif
+
+#ifdef OPENVX_USE_ENHANCED_VISION
+
+TESTCASE_TESTS(TensorEnhanced, testvxCreateImageObjectArrayFromTensor)
+
+#endif
diff --git a/test_conformance/test_warpaffine.c b/test_conformance/test_warpaffine.c
index 700597d..071b35c 100644
--- a/test_conformance/test_warpaffine.c
+++ b/test_conformance/test_warpaffine.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <math.h>
 #include <float.h>
 #include <string.h>
@@ -99,28 +101,47 @@
 #define VX_NN_AREA_SIZE         1.5
 #define VX_BILINEAR_TOLERANCE   1
 
-static CT_Image warp_affine_read_image_8u(const char* fileName, int width, int height)
+static CT_Image warp_affine_read_image(const char* fileName, int width, int height, vx_df_image format)
 {
-    CT_Image image = NULL;
+    CT_Image image_load = NULL, image_ret = NULL;
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
 
-    image = ct_read_image(fileName, 1);
-    ASSERT_(return 0, image);
-    ASSERT_(return 0, image->format == VX_DF_IMAGE_U8);
+    image_load = ct_read_image(fileName, 1);
+    ASSERT_(return 0, image_load);
+    ASSERT_(return 0, image_load->format == VX_DF_IMAGE_U8);
 
-    return image;
+    if (format == VX_DF_IMAGE_U1)
+    {
+        ASSERT_NO_FAILURE_(return 0, threshold_U8_ct_image(image_load, 127));   // Threshold to make the U1 image less trivial
+        ASSERT_NO_FAILURE_(return 0, image_ret = ct_allocate_image(image_load->width, image_load->height, VX_DF_IMAGE_U1));
+        ASSERT_NO_FAILURE_(return 0, U8_ct_image_to_U1_ct_image(image_load, image_ret));
+    }
+    else    // format == VX_DF_IMAGE_U8
+    {
+        image_ret = image_load;
+    }
+
+    ASSERT_(return 0, image_ret);
+    ASSERT_(return 0, image_ret->format == format);
+
+    return image_ret;
 }
 
-static CT_Image warp_affine_generate_random(const char* fileName, int width, int height)
+static CT_Image warp_affine_generate_random(const char* fileName, int width, int height, vx_df_image format)
 {
     CT_Image image;
+    ASSERT_(return 0, format == VX_DF_IMAGE_U1 || format == VX_DF_IMAGE_U8);
 
-    ASSERT_NO_FAILURE_(return 0,
-            image = ct_allocate_ct_image_random(width, height, VX_DF_IMAGE_U8, &CT()->seed_, 0, 256));
+    if (format == VX_DF_IMAGE_U1)
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 2));
+    else    // format == VX_DF_IMAGE_U8
+        ASSERT_NO_FAILURE_(return 0, image = ct_allocate_ct_image_random(width, height, format, &CT()->seed_, 0, 256));
 
     return image;
 }
 
 #define RND_FLT(low, high)      (vx_float32)CT_RNG_NEXT_REAL(CT()->seed_, low, high);
+
 static void warp_affine_generate_matrix(vx_float32* m, int src_width, int src_height, int dst_width, int dst_height, int type)
 {
     vx_float32 mat[3][2];
@@ -212,16 +233,29 @@
     return matrix;
 }
 
-
 static int warp_affine_check_pixel(CT_Image input, CT_Image output, int x, int y, vx_enum interp_type, vx_border_t border, vx_float32 *m)
 {
     vx_float64 x0, y0, xlower, ylower, s, t;
-    vx_int32 xi, yi;
+    vx_int32 xo, yo, xi, yi, roi_xi, roi_yi, xiShft;
     int candidate;
-    vx_uint8 res = *CT_IMAGE_DATA_PTR_8U(output, x, y);
+    vx_df_image format = input->format;
 
-    x0 = (vx_float64)m[2 * 0 + 0] * (vx_float64)x + (vx_float64)m[2 * 1 + 0] * (vx_float64)y + (vx_float64)m[2 * 2 + 0];
-    y0 = (vx_float64)m[2 * 0 + 1] * (vx_float64)x + (vx_float64)m[2 * 1 + 1] * (vx_float64)y + (vx_float64)m[2 * 2 + 1];
+    xo = x + output->roi.x - (format == VX_DF_IMAGE_U1 ? output->roi.x % 8 : 0);    // ROI independent cordinates
+    yo = y + output->roi.y;
+    roi_xi = input->roi.x;
+    roi_yi = input->roi.y;
+    xiShft = (format == VX_DF_IMAGE_U1) ? input->roi.x % 8 : 0; // Bit-shift used for U1 input image
+
+    vx_uint8 res;
+    if (format == VX_DF_IMAGE_U1)
+        res = (*CT_IMAGE_DATA_PTR_1U(output, x, y) & (1 << (x % 8))) >> (x % 8);
+    else
+        res =  *CT_IMAGE_DATA_PTR_8U(output, x, y);
+
+    x0 = (vx_float64)m[2 * 0 + 0] * (vx_float64)xo + (vx_float64)m[2 * 1 + 0] * (vx_float64)yo + (vx_float64)m[2 * 2 + 0];
+    y0 = (vx_float64)m[2 * 0 + 1] * (vx_float64)xo + (vx_float64)m[2 * 1 + 1] * (vx_float64)yo + (vx_float64)m[2 * 2 + 1];
+    x0 = x0 - (vx_float64)roi_xi + xiShft;       // Switch to ROI-respecting coordinates
+    y0 = y0 - (vx_float64)roi_yi;
 
     if (VX_INTERPOLATION_NEAREST_NEIGHBOR == interp_type)
     {
@@ -229,13 +263,20 @@
         {
             for (xi = (vx_int32)ceil(x0 - VX_NN_AREA_SIZE); (vx_float64)xi <= x0 + VX_NN_AREA_SIZE; xi++)
             {
-                if (0 <= xi && 0 <= yi && xi < (vx_int32)input->width && yi < (vx_int32)input->height)
+                if (xi >= xiShft                          && yi >= 0 &&
+                    xi <  (vx_int32)input->width + xiShft && yi <  (vx_int32)input->height)
                 {
-                    candidate = *CT_IMAGE_DATA_PTR_8U(input, xi, yi);
+                    if (format == VX_DF_IMAGE_U1)
+                        candidate = (*CT_IMAGE_DATA_PTR_1U(input, xi, yi) & (1 << (xi % 8))) >> (xi % 8);
+                    else
+                        candidate =  *CT_IMAGE_DATA_PTR_8U(input, xi, yi);
                 }
                 else if (VX_BORDER_CONSTANT == border.mode)
                 {
-                    candidate = border.constant_value.U8;
+                    if (format == VX_DF_IMAGE_U1)
+                        candidate = border.constant_value.U1 ? 1 : 0;
+                    else
+                        candidate = border.constant_value.U8;
                 }
                 else
                 {
@@ -245,7 +286,7 @@
                     return 0;
             }
         }
-        CT_FAIL_(return 1, "Check failed for pixel (%d, %d): %d", x, y, (int)res);
+        CT_FAIL_(return 1, "Check failed for pixel (%d, %d): %d", xo, yo, (int)res);
     }
     else if (VX_INTERPOLATION_BILINEAR == interp_type)
     {
@@ -261,24 +302,61 @@
         candidate = -1;
         if (VX_BORDER_UNDEFINED == border.mode)
         {
-            if (0 <= xi && 0 <= yi && xi < (vx_int32)input->width - 1 && yi < (vx_int32)input->height - 1)
+            if (xi >= xiShft                             && yi >= 0 &&
+                xi < (vx_int32)input->width - 1 + xiShft && yi < (vx_int32)input->height - 1)
             {
-                candidate = (int)((1. - s) * (1. - t) * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi    , yi    ) +
-                                        s  * (1. - t) * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi + 1, yi    ) +
-                                  (1. - s) *       t  * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi    , yi + 1) +
-                                        s  *       t  * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi + 1, yi + 1));
+                if (format == VX_DF_IMAGE_U1)
+                {
+                    vx_uint8 p00 = (*CT_IMAGE_DATA_PTR_1U(input, xi    , yi    ) & (1 <<  xi      % 8)) >> ( xi      % 8);
+                    vx_uint8 p10 = (*CT_IMAGE_DATA_PTR_1U(input, xi + 1, yi    ) & (1 << (xi + 1) % 8)) >> ((xi + 1) % 8);
+                    vx_uint8 p01 = (*CT_IMAGE_DATA_PTR_1U(input, xi    , yi + 1) & (1 <<  xi      % 8)) >> ( xi      % 8);
+                    vx_uint8 p11 = (*CT_IMAGE_DATA_PTR_1U(input, xi + 1, yi + 1) & (1 << (xi + 1) % 8)) >> ((xi + 1) % 8);
+                    candidate = (int)((1. - s) * (1. - t) * (vx_float64) p00 +
+                                            s  * (1. - t) * (vx_float64) p10 +
+                                      (1. - s) *       t  * (vx_float64) p01 +
+                                            s  *       t  * (vx_float64) p11 + 0.5); // Arithmetic rounding instead of truncation
+                    candidate = (candidate > 1) ? 1 : (candidate < 0) ? 0 : candidate;
+                }
+                else
+                {
+                    candidate = (int)((1. - s) * (1. - t) * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi    , yi    ) +
+                                            s  * (1. - t) * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi + 1, yi    ) +
+                                      (1. - s) *       t  * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi    , yi + 1) +
+                                            s  *       t  * (vx_float64) *CT_IMAGE_DATA_PTR_8U(input, xi + 1, yi + 1));
+                }
             }
         }
         else if (VX_BORDER_CONSTANT == border.mode)
         {
-            candidate = (int)((1. - s) * (1. - t) * (vx_float32)CT_IMAGE_DATA_CONSTANT_8U(input, xi    , yi    , border.constant_value.U8) +
-                                    s  * (1. - t) * (vx_float32)CT_IMAGE_DATA_CONSTANT_8U(input, xi + 1, yi    , border.constant_value.U8) +
-                              (1. - s) *       t  * (vx_float32)CT_IMAGE_DATA_CONSTANT_8U(input, xi    , yi + 1, border.constant_value.U8) +
-                                    s  *       t  * (vx_float32)CT_IMAGE_DATA_CONSTANT_8U(input, xi + 1, yi + 1, border.constant_value.U8));
+            if (format == VX_DF_IMAGE_U1)
+            {
+                vx_uint8 p00 = CT_IMAGE_DATA_CONSTANT_1U(input, xi    , yi    , border.constant_value.U1);
+                vx_uint8 p10 = CT_IMAGE_DATA_CONSTANT_1U(input, xi + 1, yi    , border.constant_value.U1);
+                vx_uint8 p01 = CT_IMAGE_DATA_CONSTANT_1U(input, xi    , yi + 1, border.constant_value.U1);
+                vx_uint8 p11 = CT_IMAGE_DATA_CONSTANT_1U(input, xi + 1, yi + 1, border.constant_value.U1);
+                candidate = (int)((1. - s) * (1. - t) * (vx_float32)p00 +
+                                        s  * (1. - t) * (vx_float32)p10 +
+                                  (1. - s) *       t  * (vx_float32)p01 +
+                                        s  *       t  * (vx_float32)p11 + 0.5);
+                candidate = (candidate > 1) ? 1 : (candidate < 0) ? 0 : candidate;
+            }
+            else
+            {
+                vx_uint8 p00 = CT_IMAGE_DATA_CONSTANT_8U(input, xi    , yi    , border.constant_value.U8);
+                vx_uint8 p10 = CT_IMAGE_DATA_CONSTANT_8U(input, xi + 1, yi    , border.constant_value.U8);
+                vx_uint8 p01 = CT_IMAGE_DATA_CONSTANT_8U(input, xi    , yi + 1, border.constant_value.U8);
+                vx_uint8 p11 = CT_IMAGE_DATA_CONSTANT_8U(input, xi + 1, yi + 1, border.constant_value.U8);
+                candidate = (int)((1. - s) * (1. - t) * (vx_float32)p00 +
+                                        s  * (1. - t) * (vx_float32)p10 +
+                                  (1. - s) *       t  * (vx_float32)p01 +
+                                        s  *       t  * (vx_float32)p11);
+            }
         }
-        if (candidate == -1 || (abs(candidate - res) <= VX_BILINEAR_TOLERANCE))
+        // A tolerance of 1 would make tests on U1 images trivial
+        if ( candidate == -1 || (abs(candidate - res) <= ((format == VX_DF_IMAGE_U1) ? 0 : VX_BILINEAR_TOLERANCE)) )
             return 0;
-        return 1;
+        else
+            return 1;
     }
     CT_FAIL_(return 1, "Interpolation type undefined");
 }
@@ -287,10 +365,20 @@
 {
     vx_uint32 err_count = 0;
 
-    CT_FILL_IMAGE_8U(, output,
-            {
-                ASSERT_NO_FAILURE(err_count += warp_affine_check_pixel(input, output, x, y, interp_type, border, m));
-            });
+    if (input->format == VX_DF_IMAGE_U1)
+    {
+        CT_FILL_IMAGE_1U(, output,
+                {
+                    ASSERT_NO_FAILURE(err_count += warp_affine_check_pixel(input, output, xShftd, y, interp_type, border, m));
+                });
+    }
+    else
+    {
+        CT_FILL_IMAGE_8U(, output,
+                {
+                    ASSERT_NO_FAILURE(err_count += warp_affine_check_pixel(input, output, x, y, interp_type, border, m));
+                });
+    }
     if (10 * err_count > output->width * output->height)
         CT_FAIL_(return, "Check failed for %d pixels", err_count);
 }
@@ -304,6 +392,12 @@
     ASSERT( (border.mode == VX_BORDER_UNDEFINED) ||
             (border.mode == VX_BORDER_CONSTANT));
 
+    ASSERT( (input->format == output->format) &&
+            (input->format == VX_DF_IMAGE_U1 || input->format == VX_DF_IMAGE_U8));
+
+    ASSERT( ((input->width  == output->width)  || (input->roi.width  == output->roi.width)) &&
+            ((input->height == output->height) || (input->roi.height == output->roi.height)));
+
     warp_affine_validate(input, output, interp_type, border, m);
     if (CT_HasFailure())
     {
@@ -319,13 +413,13 @@
 
 typedef struct {
     const char* testName;
-    CT_Image(*generator)(const char* fileName, int width, int height);
+    CT_Image(*generator)(const char* fileName, int width, int height, vx_df_image format);
     const char* fileName;
-    int src_width, src_height;
     int width, height;
     vx_border_t border;
     vx_enum interp_type;
     int matrix_type;
+    vx_df_image format;
 } Arg;
 
 #define ADD_VX_BORDERS_WARP_AFFINE(testArgName, nextmacro, ...) \
@@ -335,6 +429,11 @@
     CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=127", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 127 }} })), \
     CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=255", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 255 }} }))
 
+#define ADD_VX_BORDERS_WARP_AFFINE_MINIMAL(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_UNDEFINED", __VA_ARGS__, { VX_BORDER_UNDEFINED, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=0", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=255", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 255 }} }))
+
 #define ADD_VX_INTERP_TYPE_WARP_AFFINE(testArgName, nextmacro, ...) \
     CT_EXPAND(nextmacro(testArgName "/VX_INTERPOLATION_NEAREST_NEIGHBOR", __VA_ARGS__, VX_INTERPOLATION_NEAREST_NEIGHBOR)), \
     CT_EXPAND(nextmacro(testArgName "/VX_INTERPOLATION_BILINEAR", __VA_ARGS__, VX_INTERPOLATION_BILINEAR ))
@@ -349,10 +448,16 @@
     CT_EXPAND(nextmacro(testArgName "/VX_MATRIX_SCALE_ROTATE", __VA_ARGS__, VX_MATRIX_SCALE_ROTATE)), \
     CT_EXPAND(nextmacro(testArgName "/VX_MATRIX_RANDOM", __VA_ARGS__,       VX_MATRIX_RANDOM))
 
+#define ADD_VX_MATRIX_PARAM_WARP_AFFINE_MINIMAL(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_MATRIX_IDENT", __VA_ARGS__,        VX_MATRIX_IDENT)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_MATRIX_SCALE_ROTATE", __VA_ARGS__, VX_MATRIX_SCALE_ROTATE)), \
+    CT_EXPAND(nextmacro(testArgName "/VX_MATRIX_RANDOM", __VA_ARGS__,       VX_MATRIX_RANDOM))
 
 #define PARAMETERS \
-    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ADD_VX_BORDERS_WARP_AFFINE, ADD_VX_INTERPOLATION_TYPE_NEAREST_NEIGHBOR, ADD_VX_MATRIX_PARAM_WARP_AFFINE, ARG, warp_affine_generate_random, NULL, 128, 128), \
-    CT_GENERATE_PARAMETERS("lena", ADD_SIZE_SMALL_SET, ADD_VX_BORDERS_WARP_AFFINE, ADD_VX_INTERP_TYPE_WARP_AFFINE, ADD_VX_MATRIX_PARAM_WARP_AFFINE, ARG, warp_affine_read_image_8u, "lena.bmp", 0, 0)
+    CT_GENERATE_PARAMETERS("random", ADD_SIZE_SMALL_SET, ADD_VX_BORDERS_WARP_AFFINE, ADD_VX_INTERPOLATION_TYPE_NEAREST_NEIGHBOR, ADD_VX_MATRIX_PARAM_WARP_AFFINE, ADD_TYPE_U8, ARG, warp_affine_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("lena", ADD_SIZE_NONE, ADD_VX_BORDERS_WARP_AFFINE, ADD_VX_INTERP_TYPE_WARP_AFFINE, ADD_VX_MATRIX_PARAM_WARP_AFFINE, ADD_TYPE_U8, ARG, warp_affine_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/random", ADD_SIZE_SMALL_SET, ADD_VX_BORDERS_WARP_AFFINE_MINIMAL, ADD_VX_INTERPOLATION_TYPE_NEAREST_NEIGHBOR, ADD_VX_MATRIX_PARAM_WARP_AFFINE, ADD_TYPE_U1, ARG, warp_affine_generate_random, NULL), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_SIZE_NONE, ADD_VX_BORDERS_WARP_AFFINE_MINIMAL, ADD_VX_INTERP_TYPE_WARP_AFFINE, ADD_VX_MATRIX_PARAM_WARP_AFFINE, ADD_TYPE_U1, ARG, warp_affine_read_image, "lena.bmp")
 
 TEST_WITH_ARG(WarpAffine, testGraphProcessing, Arg,
     PARAMETERS
@@ -369,12 +474,12 @@
 
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(input = arg_->generator(arg_->fileName, arg_->src_width, arg_->src_height));
-    ASSERT_NO_FAILURE(output = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U8));
+    ASSERT_NO_FAILURE(input = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+    ASSERT_NO_FAILURE(output = ct_allocate_image(input->width, input->height, input->format));
 
     ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(output_image = ct_image_to_vx_image(output, context), VX_TYPE_IMAGE);
-    ASSERT_NO_FAILURE(warp_affine_generate_matrix(m, input->width, input->height, arg_->width, arg_->height, arg_->matrix_type));
+    ASSERT_NO_FAILURE(warp_affine_generate_matrix(m, input->width, input->height, input->width/2, input->height/2, arg_->matrix_type));
     ASSERT_VX_OBJECT(matrix = warp_affine_create_matrix(context, m), VX_TYPE_MATRIX);
 
     ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
@@ -415,12 +520,12 @@
 
     vx_border_t border = arg_->border;
 
-    ASSERT_NO_FAILURE(input = arg_->generator(arg_->fileName, arg_->src_width, arg_->src_height));
-    ASSERT_NO_FAILURE(output = ct_allocate_image(arg_->width, arg_->height, VX_DF_IMAGE_U8));
+    ASSERT_NO_FAILURE(input = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+    ASSERT_NO_FAILURE(output = ct_allocate_image(input->width, input->height, input->format));
 
     ASSERT_VX_OBJECT(input_image = ct_image_to_vx_image(input, context), VX_TYPE_IMAGE);
     ASSERT_VX_OBJECT(output_image = ct_image_to_vx_image(output, context), VX_TYPE_IMAGE);
-    ASSERT_NO_FAILURE(warp_affine_generate_matrix(m, input->width, input->height, arg_->width, arg_->height, arg_->matrix_type));
+    ASSERT_NO_FAILURE(warp_affine_generate_matrix(m, input->width, input->height, input->width/2, input->height/2, arg_->matrix_type));
     ASSERT_VX_OBJECT(matrix = warp_affine_create_matrix(context, m), VX_TYPE_MATRIX);
 
     VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
@@ -440,8 +545,71 @@
     ASSERT(input_image == 0);
 }
 
+typedef struct {
+    const char* testName;
+    CT_Image (*generator)(const char* fileName, int width, int height, vx_df_image format);
+    const char* fileName;
+    int width, height;
+    vx_border_t border;
+    vx_enum interp_type;
+    int matrix_type;
+    vx_df_image format;
+    vx_rectangle_t region_shift;
+} ValidRegionTest_Arg;
+
+#define REGION_PARAMETERS \
+    CT_GENERATE_PARAMETERS("lena", ADD_SIZE_256x256, ADD_VX_BORDERS_WARP_AFFINE_MINIMAL, ADD_VX_INTERP_TYPE_WARP_AFFINE, ADD_VX_MATRIX_PARAM_WARP_AFFINE_MINIMAL, ADD_TYPE_U8, ADD_VALID_REGION_SHRINKS, ARG, warp_affine_read_image, "lena.bmp"), \
+    CT_GENERATE_PARAMETERS("_U1_/lena", ADD_SIZE_256x256, ADD_VX_BORDERS_WARP_AFFINE_MINIMAL, ADD_VX_INTERP_TYPE_WARP_AFFINE, ADD_VX_MATRIX_PARAM_WARP_AFFINE_MINIMAL, ADD_TYPE_U1, ADD_VALID_REGION_SHRINKS, ARG, warp_affine_read_image, "lena.bmp")
+
+TEST_WITH_ARG(WarpAffine, testWithValidRegion, ValidRegionTest_Arg,
+    REGION_PARAMETERS
+)
+{
+    vx_context context = context_->vx_context_;
+    vx_image input_image = 0, output_image = 0;
+    vx_matrix matrix = 0;
+    vx_float32 m[6];
+
+    CT_Image input = NULL, output = NULL;
+
+    vx_border_t border = arg_->border;
+    vx_rectangle_t rect = {0, 0, 0, 0}, rect_shft = arg_->region_shift;
+
+    ASSERT_NO_FAILURE(input  = arg_->generator(arg_->fileName, arg_->width, arg_->height, arg_->format));
+    ASSERT_NO_FAILURE(output = ct_allocate_image(input->width, input->height, input->format));
+
+    ASSERT_VX_OBJECT(input_image  = ct_image_to_vx_image(input,  context), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(output_image = ct_image_to_vx_image(output, context), VX_TYPE_IMAGE);
+    ASSERT_NO_FAILURE(warp_affine_generate_matrix(m, input->width, input->height, input->width/2, input->height/2, arg_->matrix_type));
+    ASSERT_VX_OBJECT(matrix = warp_affine_create_matrix(context, m), VX_TYPE_MATRIX);
+
+    ASSERT_NO_FAILURE(vxGetValidRegionImage(input_image, &rect));
+    ALTERRECTANGLE(rect, rect_shft.start_x, rect_shft.start_y, rect_shft.end_x, rect_shft.end_y);
+    ASSERT_NO_FAILURE(vxSetImageValidRectangle(input_image, &rect));
+
+    VX_CALL(vxSetContextAttribute(context, VX_CONTEXT_IMMEDIATE_BORDER, &border, sizeof(border)));
+
+    VX_CALL(vxuWarpAffine(context, input_image, matrix, arg_->interp_type, output_image));
+
+    ASSERT_NO_FAILURE(output = ct_image_from_vx_image(output_image));
+
+    ASSERT_NO_FAILURE(ct_adjust_roi(input, rect_shft.start_x, rect_shft.start_y, -rect_shft.end_x, -rect_shft.end_y));
+    ASSERT_NO_FAILURE(warp_affine_check(input, output, arg_->interp_type, border, m));
+
+    VX_CALL(vxReleaseMatrix(&matrix));
+    VX_CALL(vxReleaseImage(&output_image));
+    VX_CALL(vxReleaseImage(&input_image));
+
+    ASSERT(matrix == 0);
+    ASSERT(output_image == 0);
+    ASSERT(input_image == 0);
+}
+
 TESTCASE_TESTS(WarpAffine,
         testNodeCreation,
         testGraphProcessing,
-        testImmediateProcessing
+        testImmediateProcessing,
+        testWithValidRegion
 )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_warpperspective.c b/test_conformance/test_warpperspective.c
index 9ee0aed..149f222 100644
--- a/test_conformance/test_warpperspective.c
+++ b/test_conformance/test_warpperspective.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
 #include <math.h>
 #include <float.h>
 #include <string.h>
@@ -473,3 +475,5 @@
         testGraphProcessing,
         testImmediateProcessing
 )
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_conformance/test_weighted_average.c b/test_conformance/test_weighted_average.c
new file mode 100644
index 0000000..5ce7c50
--- /dev/null
+++ b/test_conformance/test_weighted_average.c
@@ -0,0 +1,223 @@
+/*
+
+* Copyright (c) 2017-2017 The Khronos Group Inc.
+*
+* 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.
+*/
+
+#if defined OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
+
+#include <string.h>
+#include <VX/vx.h>
+#include <VX/vxu.h>
+
+#include "test_engine/test.h"
+
+#ifdef _MSC_VER
+#define ONE_255 (1.0f/255)
+#else
+#define ONE_255 0x1.010102p-8f
+#endif
+#define ONE_2_0 1.0f
+#define ONE_2_1 (1.0f/(1<<1))
+#define ONE_2_2 (1.0f/(1<<2))
+#define ONE_2_3 (1.0f/(1<<3))
+#define ONE_2_4 (1.0f/(1<<4))
+#define ONE_2_5 (1.0f/(1<<5))
+#define ONE_2_6 (1.0f/(1<<6))
+#define ONE_2_7 (1.0f/(1<<7))
+#define ONE_2_8 (1.0f/(1<<8))
+#define ONE_2_9 (1.0f/(1<<9))
+#define ONE_2_10 (1.0f/(1<<10))
+#define ONE_2_11 (1.0f/(1<<11))
+#define ONE_2_12 (1.0f/(1<<12))
+#define ONE_2_13 (1.0f/(1<<13))
+#define ONE_2_14 (1.0f/(1<<14))
+#define ONE_2_15 (1.0f/(1<<15))
+
+#define ONE_255_STR "(1/255)"
+#define ONE_2_0_STR "(1/2^0)"
+#define ONE_2_1_STR "(1/2^1)"
+#define ONE_2_2_STR "(1/2^2)"
+#define ONE_2_3_STR "(1/2^3)"
+#define ONE_2_4_STR "(1/2^4)"
+#define ONE_2_5_STR "(1/2^5)"
+#define ONE_2_6_STR "(1/2^6)"
+#define ONE_2_7_STR "(1/2^7)"
+#define ONE_2_8_STR "(1/2^8)"
+#define ONE_2_9_STR "(1/2^9)"
+#define ONE_2_10_STR "(1/2^10)"
+#define ONE_2_11_STR "(1/2^11)"
+#define ONE_2_12_STR "(1/2^12)"
+#define ONE_2_13_STR "(1/2^13)"
+#define ONE_2_14_STR "(1/2^14)"
+#define ONE_2_15_STR "(1/2^15)"
+
+static void referenceWeightedAverage(CT_Image src0, CT_Image src1, vx_float32 scale, CT_Image dst)
+{
+    uint32_t i, j;
+    ASSERT(src0 && src1 && dst);
+    ASSERT(src0->width == src1->width  && src0->width == dst->width);
+    ASSERT(src0->height == src1->height && src0->height == dst->height);
+
+#define WEIGHTED_AVERAGE_LOOP(s0, s1, r)                                                                        \
+    do{                                                                                                         \
+        for (i = 0; i < dst->height; ++i)                                                                       \
+            for (j = 0; j < dst->width; ++j)                                                                    \
+            {                                                                                                   \
+                vx_int32 val0 = (vx_uint8)src0->data.s0[i * src0->stride + j];                                  \
+                vx_int32 val1 = (vx_uint8)src1->data.s1[i * src1->stride + j];                                  \
+                vx_int32 res0 = (vx_int32)((1 - scale)* (vx_float32)(val1)+ scale * (vx_float32)(val0)) ;       \
+                dst->data.r[i * dst->stride + j] = (vx_uint8)res0;                                              \
+            }                                                                                                   \
+    }while(0)
+
+    if (src0->format == VX_DF_IMAGE_U8 && src1->format == VX_DF_IMAGE_U8 && dst->format == VX_DF_IMAGE_U8)
+        WEIGHTED_AVERAGE_LOOP(y, y, y);
+    else
+        FAIL("Unsupported combination of argument formats: %.4s + %.4s = %.4s", &src0->format, &src1->format, &dst->format);
+
+#undef WEIGHTED_AVERAGE_LOOP
+}
+
+typedef struct {
+    const char* name;
+    vx_df_image format;
+    int width, height;
+    vx_float32 scale;
+} fuzzy_arg;
+
+#define FUZZY_ARG(owp, w, h, scale)                  \
+    ARG(#owp "/" #w "x" #h " " scale##_STR "=" ,     \
+        VX_DF_IMAGE_##owp, w, h, scale)
+
+#define APPEND_SCALE(macro, ...)                       \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_255)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_0)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_1)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_2)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_3)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_4)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_5)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_6)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_7)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_8)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_9)),            \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_10)),           \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_11)),           \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_12)),           \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_13)),           \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_14)),           \
+    CT_EXPAND(macro(__VA_ARGS__, ONE_2_15))
+
+#define WEIGHTED_AVERAGE_TEST_CASE(owp)         \
+    APPEND_SCALE(FUZZY_ARG, owp, 640, 480),     \
+    APPEND_SCALE(FUZZY_ARG, owp, 15, 15),       \
+    APPEND_SCALE(FUZZY_ARG, owp, 320, 240)
+
+TESTCASE(WeightedAverage, CT_VXContext, ct_setup_vx_context, 0)
+
+TEST_WITH_ARG(WeightedAverage, testvxWeightedAverage, fuzzy_arg,
+    WEIGHTED_AVERAGE_TEST_CASE(U8))
+{
+    int format = arg_->format;
+    vx_scalar scale = 0;
+    vx_image src_in0;
+    vx_image src_in1;
+    vx_image out;
+    CT_Image ref1, ref2, vxout, refdst;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(out = vxCreateImage(context, arg_->width, arg_->height, format), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(scale = vxCreateScalar(context, VX_TYPE_FLOAT32, &arg_->scale), VX_TYPE_SCALAR);
+
+    ASSERT_VX_OBJECT(src_in0 = vxCreateImage(context, arg_->width, arg_->height, format), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src_in1 = vxCreateImage(context, arg_->width, arg_->height, format), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(ct_fill_image_random(src_in0, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src_in1, &CT()->seed_));
+
+    ASSERT_VX_OBJECT(vxWeightedAverageNode(graph, src_in0, scale, src_in1, out), VX_TYPE_NODE);
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxProcessGraph(graph));
+
+    ref1 = ct_image_from_vx_image(src_in0);
+    ref2 = ct_image_from_vx_image(src_in1);
+    vxout = ct_image_from_vx_image(out);
+    refdst = ct_allocate_image(arg_->width, arg_->height, format);
+
+    referenceWeightedAverage(ref1, ref2, arg_->scale, refdst);
+
+    EXPECT_EQ_CTIMAGE(refdst, vxout);
+
+    if (node)
+        VX_CALL(vxReleaseNode(&node));
+    if (graph)
+        VX_CALL(vxReleaseGraph(&graph));
+    ASSERT(node == 0 && graph == 0);
+    VX_CALL(vxReleaseImage(&src_in0));
+    VX_CALL(vxReleaseImage(&src_in1));
+    VX_CALL(vxReleaseScalar(&scale));
+    VX_CALL(vxReleaseImage(&out));
+}
+
+TEST_WITH_ARG(WeightedAverage, testvxuWeightedAverage, fuzzy_arg,
+    WEIGHTED_AVERAGE_TEST_CASE(U8))
+{
+    int format = arg_->format;
+    vx_scalar scale = 0;
+    vx_image src_in0;
+    vx_image src_in1;
+    vx_image out;
+    CT_Image ref1, ref2, vxout, refdst;
+    vx_graph graph = 0;
+    vx_node node = 0;
+    vx_context context = context_->vx_context_;
+
+    ASSERT_VX_OBJECT(graph = vxCreateGraph(context), VX_TYPE_GRAPH);
+    ASSERT_VX_OBJECT(out = vxCreateImage(context, arg_->width, arg_->height, format), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(scale = vxCreateScalar(context, VX_TYPE_FLOAT32, &arg_->scale), VX_TYPE_SCALAR);
+
+    ASSERT_VX_OBJECT(src_in0 = vxCreateImage(context, arg_->width, arg_->height, format), VX_TYPE_IMAGE);
+    ASSERT_VX_OBJECT(src_in1 = vxCreateImage(context, arg_->width, arg_->height, format), VX_TYPE_IMAGE);
+
+    ASSERT_NO_FAILURE(ct_fill_image_random(src_in0, &CT()->seed_));
+    ASSERT_NO_FAILURE(ct_fill_image_random(src_in1, &CT()->seed_));
+
+    ASSERT_EQ_VX_STATUS(VX_SUCCESS, vxuWeightedAverage(context, src_in0, scale, src_in1, out));
+
+    ref1 = ct_image_from_vx_image(src_in0);
+    ref2 = ct_image_from_vx_image(src_in1);
+    vxout = ct_image_from_vx_image(out);
+    refdst = ct_allocate_image(arg_->width, arg_->height, format);
+
+    referenceWeightedAverage(ref1, ref2, arg_->scale, refdst);
+
+    EXPECT_EQ_CTIMAGE(refdst, vxout);
+
+    if (node)
+        VX_CALL(vxReleaseNode(&node));
+    if (graph)
+        VX_CALL(vxReleaseGraph(&graph));
+    ASSERT(node == 0 && graph == 0);
+    VX_CALL(vxReleaseImage(&src_in0));
+    VX_CALL(vxReleaseImage(&src_in1));
+    VX_CALL(vxReleaseScalar(&scale));
+    VX_CALL(vxReleaseImage(&out));
+}
+
+TESTCASE_TESTS(WeightedAverage, testvxWeightedAverage, testvxuWeightedAverage)
+
+#endif //OPENVX_USE_ENHANCED_VISION || OPENVX_CONFORMANCE_VISION
diff --git a/test_engine/test_bmp.c b/test_engine/test_bmp.c
index c641cdc..15f5d6b 100644
--- a/test_engine/test_bmp.c
+++ b/test_engine/test_bmp.c
@@ -555,9 +555,19 @@
 {
     if( image )
     {
-        int channels = ct_channels(image->format);
-        return writeBMP(filename, image->data.y, (int)ct_stride_bytes(image),
-                        (int)image->width, (int)image->height, channels);
+        CT_Image wrt_image;
+        if (image->format == VX_DF_IMAGE_U1)
+        {
+            wrt_image = ct_allocate_image(image->width, image->height, VX_DF_IMAGE_U8);
+            U1_ct_image_to_U8_ct_image(image, wrt_image);
+        }
+        else
+        {
+            wrt_image = image;
+        }
+        int channels = ct_channels(wrt_image->format);
+        return writeBMP(filename, wrt_image->data.y, (int)ct_stride_bytes(wrt_image),
+                        (int)wrt_image->width, (int)wrt_image->height, channels);
     }
     return -1;
 }
diff --git a/test_engine/test_engine.c b/test_engine/test_engine.c
index 007ffc4..c9538c3 100644
--- a/test_engine/test_engine.c
+++ b/test_engine/test_engine.c
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -337,6 +337,14 @@
         result = 0;
     }
 
+#ifndef OPENVX_USE_U1
+    // Filter out tests whose name include the tag "_U1_" if the test suite isn't configured to test U1 conformance
+    if (result && strstr(test_name, "_U1_") != NULL)
+    {
+        result = 0;
+    }
+#endif
+
     return result;
 }
 
@@ -518,6 +526,62 @@
     int total_openvx_passed_ix_tests = 0;
     int total_openvx_failed_ix_tests = 0;
 #endif
+#ifdef OPENVX_USE_PIPELINING
+    int total_openvx_pipe_tests = 0;
+    int total_openvx_passed_pipe_tests = 0;
+    int total_openvx_failed_pipe_tests = 0;
+#endif
+#ifdef OPENVX_USE_STREAMING
+    int total_openvx_stream_tests = 0;
+    int total_openvx_passed_stream_tests = 0;
+    int total_openvx_failed_stream_tests = 0;
+#endif
+#ifdef OPENVX_USE_USER_DATA_OBJECT
+    int total_openvx_udo_tests = 0;
+    int total_openvx_passed_udo_tests = 0;
+    int total_openvx_failed_udo_tests = 0;
+#endif
+#ifdef OPENVX_USE_U1
+    int total_openvx_u1_tests = 0;
+    int total_openvx_passed_u1_tests = 0;
+    int total_openvx_failed_u1_tests = 0;
+#endif
+#ifdef OPENVX_CONFORMANCE_VISION
+    int total_openvx_vision_tests = 0;
+    int total_openvx_passed_vision_tests = 0;
+    int total_openvx_failed_vision_tests = 0;
+#define vision_test_num 51
+    int conformance_vision_status = 0;
+    const char* vision_test[vision_test_num] = {"vxuConvertDepth", "vxConvertDepth", "ChannelCombine", "ChannelExtract", "ColorConvert",
+                                   "vxuAddSub", "vxAddSub", "vxuNot", "vxNot", "vxuBinOp1u",
+                                   "vxBinOp1u", "vxuBinOp8u", "vxBinOp8u", "vxuBinOp16s", "vxBinOp16s",
+                                   "vxuMultiply", "vxMultiply", "Histogram", "EqualizeHistogram", "MeanStdDev",
+                                   "MinMaxLoc", "WeightedAverage", "Threshold", "Box3x3", "Convolve",
+                                   "Dilate3x3", "Erode3x3", "Gaussian3x3", "Median3x3", "Sobel3x3",
+                                   "NonLinearFilter", "Integral", "Magnitude", "Phase", "FastCorners",
+                                   "HarrisCorners", "Scale", "WarpAffine", "WarpPerspective", "Remap",
+                                   "GaussianPyramid", "HalfScaleGaussian", "LaplacianPyramid", "LaplacianReconstruct", "vxuCanny",
+                                   "vxCanny", "OptFlowPyrLK", "LUT", "Accumulate", "AccumulateSquare", "AccumulateWeighted"};
+#endif
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
+    int total_openvx_neural_networks_tests = 0;
+    int total_openvx_passed_neural_networks_tests = 0;
+    int total_openvx_failed_neural_networks_tests = 0;
+#endif
+#ifdef OPENVX_CONFORMANCE_NNEF_IMPORT
+    int total_openvx_nnef_tests = 0;
+    int total_openvx_passed_nnef_tests = 0;
+    int total_openvx_failed_nnef_tests = 0;
+#endif
+#ifdef OPENVX_USE_ENHANCED_VISION
+    int total_openvx_use_enhanced_vision_tests = 0;
+    int total_openvx_passed_use_enhanced_vision_tests = 0;
+    int total_openvx_failed_use_enhanced_vision_tests = 0;
+#define enhance_vision_num  13
+    int conformance_enhanced_vision_status = 0;
+    const char* enhanced_vision_test[enhance_vision_num] = {"Min", "Max", "Nonmaxsuppression", "TensorOp", "LBP", "BilateralFilter",
+    "MatchTemplate", "Houghlinesp", "Copy", "HogCells", "HogFeatures", "ControlFlow", "Scalar"};
+#endif
     //====================================================
 
     int use_global_context = 0;
@@ -671,6 +735,7 @@
 
     for (testcase = g_firstTestCase; testcase; testcase = testcase->next_)
     {
+        int test_ran = 0;
         int run_tests = 0;
         int extended_flag = 0;
         struct CT_TestEntry* test = testcase->tests_;
@@ -678,16 +743,48 @@
 #ifdef CT_TEST_TIME
         int64_t timestart_testCase = CT_getTickCount();
 #endif
+#ifdef OPENVX_USE_U1
+        // Counter for the number of U1 tests in the given testcase
+        int run_tests_u1 = 0;
+#endif
 
         for(; test; test = test->next_)
         {
             if (!test->args_)
-                run_tests += run_test(testcase, test, 0, run_tests, &extended_flag);
+            {
+                test_ran = run_test(testcase, test, 0, run_tests, &extended_flag);
+                run_tests += test_ran;
+#ifdef OPENVX_USE_U1
+                // Look for the "_U1_" tag in the full test name
+                char test_name_full[1024];
+                void *parg = get_test_params(test, 0);
+                get_test_name(test_name_full, sizeof(test_name_full), testcase, test, parg, 0);
+
+                if (test_ran && strstr(test_name_full, "_U1_") != NULL) {
+                    total_openvx_u1_tests++;
+                    run_tests_u1++;
+                }
+#endif
+            }
+
             else
             {
                 int narg = 0;
                 for (; narg < test->args_count_; narg++)
-                    run_tests += run_test(testcase, test, narg, run_tests, &extended_flag);
+                {
+                    test_ran = run_test(testcase, test, narg, run_tests, &extended_flag);
+                    run_tests += test_ran;
+#ifdef OPENVX_USE_U1
+                    char test_name_full[1024];
+                    void *parg = get_test_params(test, narg);
+                    get_test_name(test_name_full, sizeof(test_name_full), testcase, test, parg, narg);
+
+                    if (test_ran && strstr(test_name_full, "_U1_") != NULL) {
+                        total_openvx_u1_tests++;
+                        run_tests_u1++;
+                    }
+#endif
+                }
             }
         }
 
@@ -708,17 +805,74 @@
             if (strcmp("TensorNN", testcase->name_) == 0) {
                 total_openvx_nn_tests += run_tests;
             }
-            else
 #endif
 #ifdef OPENVX_USE_IX
             if (strcmp("ExtensionObject", testcase->name_) == 0) {
                     total_openvx_ix_tests += run_tests;
             }
-            else
 #endif
-            {
-                    total_openvx_core_tests += run_tests;
+#ifdef OPENVX_USE_PIPELINING
+            if (strcmp("GraphPipeline", testcase->name_) == 0) {
+                    total_openvx_pipe_tests += run_tests;
             }
+#endif
+#ifdef OPENVX_USE_STREAMING
+            if (strcmp("GraphStreaming", testcase->name_) == 0) {
+                    total_openvx_stream_tests += run_tests;
+            }
+#endif
+#ifdef OPENVX_USE_USER_DATA_OBJECT
+            if (strcmp("UserDataObject", testcase->name_) == 0) {
+                    total_openvx_udo_tests += run_tests;
+            }
+#endif
+#ifdef OPENVX_CONFORMANCE_VISION
+            for (int i = 0; i < vision_test_num; i++) {
+                if (strcmp(vision_test[i], testcase->name_) == 0) {
+                    conformance_vision_status = 1;
+                    i = vision_test_num;
+                }
+            }
+            if (conformance_vision_status == 1) {
+                total_openvx_vision_tests += run_tests;
+            }
+#endif
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
+#ifdef OPENVX_USE_NN
+            if (strcmp("TensorNN", testcase->name_) == 0) {
+                total_openvx_neural_networks_tests += run_tests;
+            }
+#endif
+#ifdef OPENVX_USE_NN_16
+            if (strcmp("TensorNetworks", testcase->name_) == 0) {
+                total_openvx_neural_networks_tests += run_tests;
+            }
+#endif
+#endif
+#ifdef OPENVX_CONFORMANCE_NNEF_IMPORT
+            if (strcmp("TensorNNEFImport", testcase->name_) == 0) {
+                total_openvx_nnef_tests += run_tests;
+            }
+#endif
+#ifdef OPENVX_USE_ENHANCED_VISION
+            for (int i = 0; i < enhance_vision_num; i++) {
+                if (strcmp(enhanced_vision_test[i], testcase->name_) == 0) {
+                    conformance_enhanced_vision_status = 1;
+                    i = enhance_vision_num;
+                }
+            }
+            if (conformance_enhanced_vision_status == 1) {
+                total_openvx_use_enhanced_vision_tests += run_tests;
+            }
+#endif
+            else
+            {
+#ifdef OPENVX_USE_U1
+                total_openvx_core_tests -= run_tests_u1;
+#endif
+                total_openvx_core_tests += run_tests;
+            }
+
             //====================================================
 
             total_run_tests += run_tests;
@@ -750,6 +904,24 @@
 
 
                 //================ OpenVX Specific ===================
+#ifdef OPENVX_CONFORMANCE_VISION
+                for (int i = 0; i < vision_test_num; i++) {
+                    conformance_vision_status = 0;
+                    if (strncmp(vision_test[i], test_name, sizeof(vision_test[i]) - 1) == 0) {
+                        conformance_vision_status = 1;
+                        i = vision_test_num;
+                    }
+                }
+#endif
+#ifdef OPENVX_USE_ENHANCED_VISION
+                for (int i = 0; i < enhance_vision_num; i++) {
+                    conformance_enhanced_vision_status = 0;
+                    if (strncmp(enhanced_vision_test[i], test_name, sizeof(enhanced_vision_test[i]) - 1) == 0) {
+                        conformance_enhanced_vision_status = 1;
+                        i = enhance_vision_num;
+            }
+        }
+#endif
 #ifdef OPENVX_USE_NN
                 if (strncmp("TensorNN", test_name, sizeof("TensorNN") - 1) == 0) {
                     total_openvx_failed_nn_tests ++;
@@ -762,6 +934,62 @@
                 }
                 else
 #endif
+#ifdef OPENVX_USE_PIPELINING
+                if (strncmp("GraphPipeline", test_name, sizeof("GraphPipeline") - 1) == 0) {
+                    total_openvx_failed_pipe_tests ++;
+                }
+                else
+#endif
+#ifdef OPENVX_USE_STREAMING
+                if (strncmp("GraphStreaming", test_name, sizeof("GraphStreaming") - 1) == 0) {
+                    total_openvx_failed_stream_tests ++;
+                }
+                else
+#endif
+#ifdef OPENVX_USE_USER_DATA_OBJECT
+                if (strncmp("UserDataObject", test_name, sizeof("UserDataObject") - 1) == 0) {
+                    total_openvx_failed_udo_tests ++;
+                }
+                else
+#endif
+#ifdef OPENVX_CONFORMANCE_VISION
+                if (conformance_vision_status == 1) {
+                    total_openvx_failed_vision_tests ++;
+                }
+                else
+#endif
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
+#ifdef OPENVX_USE_NN
+                if (strncmp("TensorNN", test_name, sizeof("TensorNN") - 1) == 0) {
+                    total_openvx_failed_neural_networks_tests ++;
+                }
+                else
+#endif
+#ifdef OPENVX_USE_NN_16
+                if (strncmp("TensorNetworks", test_name, sizeof("TensorNetworks") - 1) == 0) {
+                    total_openvx_failed_neural_networks_tests ++;
+                }
+                else
+#endif
+#endif
+#ifdef OPENVX_CONFORMANCE_NNEF_IMPORT
+                if (strncmp("TensorNNEFImport", test_name, sizeof("TensorNNEFImport") - 1) == 0) {
+                    total_openvx_failed_nnef_tests ++;
+                }
+                else
+#endif
+#ifdef OPENVX_USE_ENHANCED_VISION
+                if (conformance_enhanced_vision_status == 1) {
+                    total_openvx_failed_use_enhanced_vision_tests++;
+                }
+                else
+#endif
+#ifdef OPENVX_USE_U1
+                if (strstr(test_name, "_U1_") != NULL) {
+                    total_openvx_failed_u1_tests ++;
+                }
+                else
+#endif
                 {
                     total_openvx_failed_core_tests ++;
                 }
@@ -801,6 +1029,62 @@
                (total_openvx_failed_ix_tests==0?"PASSED":"FAILED")
                );
 #endif
+#ifdef OPENVX_USE_PIPELINING
+        total_openvx_passed_pipe_tests = total_openvx_pipe_tests - total_openvx_failed_pipe_tests;
+        printf("To be conformant to the Pipelining extension, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+               total_openvx_pipe_tests, total_openvx_passed_pipe_tests, total_openvx_failed_pipe_tests,
+               (total_openvx_failed_pipe_tests==0?"PASSED":"FAILED")
+               );
+#endif
+#ifdef OPENVX_USE_STREAMING
+        total_openvx_passed_stream_tests = total_openvx_stream_tests - total_openvx_failed_stream_tests;
+        printf("To be conformant to the Streaming extension, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+               total_openvx_stream_tests, total_openvx_passed_stream_tests, total_openvx_failed_stream_tests,
+               (total_openvx_failed_stream_tests==0?"PASSED":"FAILED")
+               );
+#endif
+#ifdef OPENVX_USE_USER_DATA_OBJECT
+        total_openvx_passed_udo_tests = total_openvx_udo_tests - total_openvx_failed_udo_tests;
+        printf("To be conformant to the User Data Object extension, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+               total_openvx_udo_tests, total_openvx_passed_udo_tests, total_openvx_failed_udo_tests,
+               (total_openvx_failed_udo_tests==0?"PASSED":"FAILED")
+               );
+#endif
+#ifdef OPENVX_USE_U1
+        total_openvx_passed_u1_tests = total_openvx_u1_tests - total_openvx_failed_u1_tests;
+        printf("To be conformant to the U1 conformance profile, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+               total_openvx_u1_tests, total_openvx_passed_u1_tests, total_openvx_failed_u1_tests,
+               (total_openvx_failed_u1_tests==0?"PASSED":"FAILED")
+               );
+#endif
+#ifdef OPENVX_CONFORMANCE_VISION
+        total_openvx_passed_vision_tests = total_openvx_vision_tests - total_openvx_failed_vision_tests;
+        printf("To be conformant to the Vision conformance profile, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+            total_openvx_vision_tests, total_openvx_passed_vision_tests, total_openvx_failed_vision_tests,
+            (total_openvx_failed_vision_tests==0?"PASSED":"FAILED")
+            );
+#endif
+#ifdef OPENVX_CONFORMANCE_NEURAL_NETWORKS
+        total_openvx_passed_neural_networks_tests = total_openvx_neural_networks_tests - total_openvx_failed_neural_networks_tests;
+        printf("To be conformant to the Neural Networks conformance profile, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+            total_openvx_neural_networks_tests, total_openvx_passed_neural_networks_tests, total_openvx_failed_neural_networks_tests,
+            (total_openvx_failed_neural_networks_tests==0?"PASSED":"FAILED")
+            );
+#endif
+#ifdef OPENVX_CONFORMANCE_NNEF_IMPORT
+        total_openvx_passed_nnef_tests = total_openvx_nnef_tests - total_openvx_failed_nnef_tests;
+        printf("To be conformant to the Vision NNEF conformance profile, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+            total_openvx_nnef_tests, total_openvx_passed_nnef_tests, total_openvx_failed_nnef_tests,
+            (total_openvx_failed_nnef_tests==0?"PASSED":"FAILED")
+            );
+#endif
+#ifdef OPENVX_USE_ENHANCED_VISION
+        total_openvx_passed_use_enhanced_vision_tests = total_openvx_use_enhanced_vision_tests - total_openvx_failed_use_enhanced_vision_tests;
+        printf("To be conformant to the enhanced vision conformance profile, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
+            total_openvx_use_enhanced_vision_tests, total_openvx_passed_use_enhanced_vision_tests, total_openvx_failed_use_enhanced_vision_tests,
+            (total_openvx_failed_use_enhanced_vision_tests == 0 ? "PASSED" : "FAILED")
+            );
+#endif
 
         printf("Note: The %d disabled tests are optional and are not considered for conformance.\n",
                g_context.internal_->g_num_disabled_tests_);
diff --git a/test_engine/test_image.c b/test_engine/test_image.c
index 7f4eb93..5d06f97 100644
--- a/test_engine/test_image.c
+++ b/test_engine/test_image.c
@@ -27,6 +27,8 @@
 {
     switch(format)
     {
+        case VX_DF_IMAGE_U1:
+            return 1 * 1;
         case VX_DF_IMAGE_U8:
             return 8 * 1;
         case VX_DF_IMAGE_U16:
@@ -55,6 +57,7 @@
 {
     switch(format)
     {
+        case VX_DF_IMAGE_U1:
         case VX_DF_IMAGE_U8:
         case VX_DF_IMAGE_U16:
         case VX_DF_IMAGE_S16:
@@ -76,6 +79,8 @@
     uint32_t factor = 0;
     switch(image->format)
     {
+        case VX_DF_IMAGE_U1:
+            return (uint32_t)(image->stride + 7) / 8;
         case VX_DF_IMAGE_U8:
         case VX_DF_IMAGE_NV21:
         case VX_DF_IMAGE_NV12:
@@ -107,7 +112,16 @@
 
 static size_t ct_image_data_size(uint32_t width, uint32_t height, vx_df_image format)
 {
-    return (size_t)width * height * ct_image_bits_per_pixel(format) / 8;
+    if (format == VX_DF_IMAGE_U1)
+    {
+        /* round up to full bytes */
+        size_t rowSize = (size_t)(width * ct_image_bits_per_pixel(format) + 7) / 8;
+        return (size_t)rowSize * height;
+    }
+    else
+    {
+        return (size_t)width * height * ct_image_bits_per_pixel(format) / 8;
+    }
 }
 
 #ifdef DEBUG_CT_IMAGE
@@ -225,7 +239,8 @@
             break;
     };
 
-    image = ct_allocate_image_hdr_impl(width, height, width, format, 1);
+    uint32_t stride = (format == VX_DF_IMAGE_U1) ? ((width + 7) / 8) * 8 : width;   // U1 y-stride is multiple of 8
+    image = ct_allocate_image_hdr_impl(width, height, stride, format, 1);
 
 #ifdef DEBUG_CT_IMAGE
     printf("ALLOCATED: "); ct_print_image(image);
@@ -247,6 +262,9 @@
 
     switch(img->format) // not sure if roi for multi-plane formats is needed at all
     {
+        case VX_DF_IMAGE_U1:
+            CT_ASSERT_(return 0, (img->roi.x + roi.x) % 8 == 0);   // U1 subimage must start on byte boundary in parent image
+            break;
         case VX_DF_IMAGE_UYVY:
         case VX_DF_IMAGE_YUYV:
             CT_ASSERT_(return 0, roi.width % 2 == 0 && roi.x % 2 == 0); // width must be even
@@ -273,7 +291,18 @@
         ct_image_addref(img);
         image->data_begin_ = img->data_begin_;
         image->refcount_   = img->refcount_;
+
         image->data.y      = img->data.y + (img->stride * roi.y + roi.x) * bpp / 8;
+
+        if (img->format == VX_DF_IMAGE_U1)
+        {
+            int xShft = ct_div_floor(img->roi.x % 8 + roi.x, 8);
+            img->data.y = img->data.y + ct_stride_bytes(img) * roi.y + xShft;
+        }
+        else
+        {
+            img->data.y = img->data.y + (img->stride * roi.y + roi.x) * bpp / 8;
+        }
     }
 
 #ifdef DEBUG_CT_IMAGE
@@ -319,7 +348,15 @@
     }
     else
     {
-        img->data.y = img->data.y + (img->stride * top + left) * ct_image_bits_per_pixel(img->format) / 8;
+        if (img->format == VX_DF_IMAGE_U1)
+        {
+            int xShft = ct_div_floor(img->roi.x % 8 + left, 8);
+            img->data.y = img->data.y + ct_stride_bytes(img) * top + xShft;
+        }
+        else
+        {
+            img->data.y = img->data.y + (img->stride * top + left) * ct_image_bits_per_pixel(img->format) / 8;
+        }
         img->roi.x  = (uint32_t)new_x;
         img->roi.y  = (uint32_t)new_y;
         img->width  = (uint32_t)new_width;
@@ -405,6 +442,10 @@
 
     switch (format)
     {
+    case VX_DF_IMAGE_U1:
+        channel_step_x = 0;
+        break;
+
     case VX_DF_IMAGE_U8:
         channel_step_x = 1;
         break;
@@ -536,6 +577,18 @@
             {
                 switch (ct_format)
                 {
+                case VX_DF_IMAGE_U1:
+                {
+                    vx_uint8* ct_ptr = (vx_uint8*)((vx_uint8*)p_ct_base + y * ct_stride_bytes(ctimg) + x / 8);
+                    vx_uint8* vx_ptr = (vx_uint8*)vxFormatImagePatchAddress2d(p_vx_base, x, y, &addr);
+                    vx_uint8 mask = 1 << (x % 8);
+                    if (COPY_CT_IMAGE_TO_VX_IMAGE == dir)
+                        vx_ptr[0] = (vx_ptr[0] & ~mask) | (ct_ptr[0] & mask);
+                    else
+                        ct_ptr[0] = (ct_ptr[0] & ~mask) | (vx_ptr[0] & mask);
+                }
+                break;
+
                 case VX_DF_IMAGE_U8:
                 {
                     vx_uint8* ct_ptr = (vx_uint8*)((vx_uint8*)p_ct_base + y * ctimg->stride * ct_elem_size + x * ct_elem_size);
@@ -741,6 +794,72 @@
     return (COPY_CT_IMAGE_TO_VX_IMAGE == dir ? (void*)vximg : (void*)ctimg);
 }
 
+// Down conversion according to the spec (i.e. valueU1 = valueU8 != 0 ? 1 : 0)
+void U8_ct_image_to_U1_ct_image(CT_Image img_in, CT_Image img_out)
+{
+    ASSERT(img_in);
+    ASSERT(img_out);
+    ASSERT(img_in->format == VX_DF_IMAGE_U8);
+    ASSERT(img_out->format == VX_DF_IMAGE_U1);
+    ASSERT( (img_in->width == img_out->width) && (img_in->height == img_out->height) );
+
+    uint8_t pixel;
+    uint32_t x, y, xShftd;
+    uint8_t* in_base_ptr  = ct_image_get_plane_base(img_in, 0);
+    uint8_t* out_base_ptr = ct_image_get_plane_base(img_out, 0);
+    for (y = 0; y < img_in->height; ++y)
+    {
+        for (x = 0; x < img_in->width; ++x)
+        {
+            xShftd = x + img_out->roi.x % 8;     // U1 ROI respecting offset
+            pixel  = ((in_base_ptr[y * img_in->stride + x] != 0) ? 1 : 0) << (xShftd % 8);
+            out_base_ptr[y * ct_stride_bytes(img_out) + xShftd / 8] =
+                (out_base_ptr[y * ct_stride_bytes(img_out) + xShftd / 8] & ~(1 << (xShftd % 8))) | pixel;
+        }
+    }
+}
+
+// Up conversion according to the spec (i.e. valueU8 = valueU1 != 0 ? 255 : 0)
+void U1_ct_image_to_U8_ct_image(CT_Image img_in, CT_Image img_out)
+{
+    ASSERT(img_in);
+    ASSERT(img_out);
+    ASSERT(img_in->format == VX_DF_IMAGE_U1);
+    ASSERT(img_out->format == VX_DF_IMAGE_U8);
+    ASSERT( (img_in->width == img_out->width) && (img_in->height == img_out->height) );
+
+    uint8_t pixel;
+    uint32_t x, y, xShftd;
+    uint8_t* in_base_ptr  = ct_image_get_plane_base(img_in, 0);
+    uint8_t* out_base_ptr = ct_image_get_plane_base(img_out, 0);
+    for (y = 0; y < img_in->height; ++y)
+    {
+        for (x = 0; x < img_in->width; ++x)
+        {
+            xShftd = x + img_in->roi.x % 8;      // U1 ROI respecting offset
+            pixel  = in_base_ptr[y * ct_stride_bytes(img_in) + xShftd / 8] & (1 << (xShftd % 8));
+            out_base_ptr[y * img_out->stride + x] = (pixel != 0) ? 255 : 0;
+        }
+    }
+}
+
+// Threshold a U8 CT_Image with the input uint8_t threshold (new_val = old_val > thresh ? 255 : 0)
+void threshold_U8_ct_image(CT_Image img, uint8_t thresh)
+{
+    ASSERT(img);
+    ASSERT(img->width > 0 && img->height > 0);
+    ASSERT(img->format == VX_DF_IMAGE_U8);
+
+    uint32_t x, y;
+    for (y = 0; y < img->height; y++)
+    {
+        for (x = 0; x < img->width; x++)
+        {
+            img->data.y[y * img->stride + x] = (img->data.y[y * img->stride + x] > thresh) ? 255 : 0;
+        }
+    }
+}
+
 /*
     wrap_half_modulo: specifies if the smallest value follows the biggest (e.g. 255 + 1 == 0 or not)
     0            = default - half of data type range
@@ -799,7 +918,39 @@
             }                                                                                   \
     }
 
-    if (expected->format == VX_DF_IMAGE_U8)
+#define FIND_MAX_DIFF_SIMPLE_U1(eptr, aptr)                                                     \
+    {                                                                                           \
+        uint32_t xStartE, xStartA, xE, xA, maskE, maskA, diff;                                  \
+        xStartE = expected->roi.x % 8;                                                          \
+        xStartA =   actual->roi.x % 8;                                                          \
+        for (i = 0; i < expected->height; ++i)                                                  \
+            for (j = 0; j < expected->width; ++j)                                               \
+            {                                                                                   \
+                xE = j + xStartE;                                                               \
+                xA = j + xStartA;                                                               \
+                maskE = 1u << (xE % 8);                                                         \
+                maskA = 1u << (xA % 8);                                                         \
+                diff = ((eptr[i * ct_stride_bytes(expected) + xE / 8] & maskE) >> (xE % 8) !=   \
+                        (aptr[i * ct_stride_bytes(actual)   + xA / 8] & maskA) >> (xA % 8)) ? 1u : 0u; \
+               if (diff > max_diff)                                                             \
+               {                                                                                \
+                   max_diff = diff;                                                             \
+                   max_y = i;                                                                   \
+                   max_x = j;                                                                   \
+                   vale = (eptr[i * ct_stride_bytes(expected) + xE / 8] & maskE) >> (xE % 8);   \
+                   vala = (aptr[i * ct_stride_bytes(actual)   + xA / 8] & maskA) >> (xA % 8);   \
+               }                                                                                \
+               if (diff > threshold)                                                            \
+                   ++diff_pixels;                                                               \
+            }                                                                                   \
+    }                                                                                           \
+
+    if (expected->format == VX_DF_IMAGE_U1)
+    {
+        // Wrap_half_modulo is not used for U1 image comparisons
+        FIND_MAX_DIFF_SIMPLE_U1(expected->data.y, actual->data.y)
+    }
+    else if (expected->format == VX_DF_IMAGE_U8)
     {
         if (!wrap_half_modulo) wrap_half_modulo = 1u << 7;
         FIND_MAX_DIFF_SIMPLE(expected->data.y, actual->data.y)
@@ -829,7 +980,8 @@
         // skip check
     }
 
-    if (expected->format == VX_DF_IMAGE_U8 || expected->format == VX_DF_IMAGE_U16 || expected->format == VX_DF_IMAGE_U32)
+    if (expected->format == VX_DF_IMAGE_U1 || expected->format == VX_DF_IMAGE_U8 ||
+        expected->format == VX_DF_IMAGE_U16 || expected->format == VX_DF_IMAGE_U32)
     {
         if (max_diff > threshold)
         {
@@ -950,6 +1102,40 @@
     return 1;
 }
 
+uint8_t* ct_image_data_ptr_1u(CT_Image image, uint32_t x, uint32_t y)
+{
+    uint8_t* ptr = &image->data.y[y * ct_stride_bytes(image) + x / 8];
+    return ptr;
+}
+
+uint8_t ct_image_data_replicate_1u(CT_Image image, int32_t x, int32_t y)
+{
+    uint8_t offset, byte, pxl_val;
+    int32_t border_x_start = image->roi.x % 8;
+
+    EXPECT(image->width > 0 && image->height > 0);
+    if (x < border_x_start) x = border_x_start;     // Handle ROI byte-shift offset
+    if (x >= (int)image->width + border_x_start) x = image->width - 1 + border_x_start;
+    if (y < 0) y = 0;
+    if (y >= (int)image->height) y = image->height - 1;
+    offset = x % 8;
+    byte = image->data.y[y * ct_stride_bytes(image) + x / 8];
+    pxl_val = (byte & (1u << offset)) >> offset;
+    return pxl_val;
+}
+
+uint8_t ct_image_data_constant_1u(CT_Image image, int32_t x, int32_t y, vx_bool constant_value)
+{
+    uint8_t offset, byte, pxl_val;
+    int32_t border_x_start = image->roi.x % 8;
+
+    if (x < border_x_start || x >= (int)image->width + border_x_start || y < 0 || y >= (int)image->height)
+        return (uint8_t)(constant_value ? 1 : 0);
+    offset = x % 8;
+    byte = image->data.y[y * ct_stride_bytes(image) + x / 8];
+    pxl_val = (byte & (1u << offset)) >> offset;
+    return pxl_val;
+}
 
 uint8_t* ct_image_data_ptr_8u(CT_Image image, uint32_t x, uint32_t y)
 {
@@ -1005,13 +1191,27 @@
             image, (int)sizeof(image->format), (char*)&image->format,
             image->width, image->height);
 
-    if (image->format == VX_DF_IMAGE_U8)
+    if (image->format == VX_DF_IMAGE_U1)
     {
         for (y = 0; y < max_y; ++y)
         {
             for (x = 0; x < max_x; ++x)
             {
-                uint8_t* ptr = ct_image_data_ptr_8u(image, x, y);
+                int xShftd = x + image->roi.x % 8;
+                uint8_t offset = xShftd % 8;
+                uint8_t* ptr = CT_IMAGE_DATA_PTR_1U(image, xShftd, y);
+                printf("%1d ", (int)( (*ptr & (1u << offset)) >> offset ));
+            }
+            printf("%s", strend);
+        }
+    }
+    else if (image->format == VX_DF_IMAGE_U8)
+    {
+        for (y = 0; y < max_y; ++y)
+        {
+            for (x = 0; x < max_x; ++x)
+            {
+                uint8_t* ptr = CT_IMAGE_DATA_PTR_8U(image, x, y);
                 printf("%3d ", (int)*ptr);
             }
             printf("%s", strend);
@@ -1110,30 +1310,35 @@
         format = VX_DF_IMAGE_U8;
     }
 
-    ASSERT( format == VX_DF_IMAGE_U8 ||
+    ASSERT( format == VX_DF_IMAGE_U1  || format == VX_DF_IMAGE_U8  ||
             format == VX_DF_IMAGE_U16 || format == VX_DF_IMAGE_S16 ||
-            format == VX_DF_IMAGE_U32 || format == VX_DF_IMAGE_S32);
+            format == VX_DF_IMAGE_U32 || format == VX_DF_IMAGE_S32 );
 
 #undef CASE_FILL_RNG
-#define CASE_FILL_RNG(format, type, cast_macro) \
-    case format: \
-    { \
-    uint8_t* ptr = image->data.y; \
-    for( p = 0; p < nplanes; p++ ) \
-    for( y = 0; y < height[p]; y++, ptr += stride[p] ) \
-    { \
-        type* tptr = (type*)ptr; \
-        for( x = 0; x < width[p]; x++ ) \
-        { \
-            int val = CT_RNG_NEXT_INT(*seed, a, b); \
-            tptr[x] = cast_macro(val); \
-        } \
-    } \
-    } \
+#define CASE_FILL_RNG(format, type, cast_macro)                                                 \
+    case format:                                                                                \
+    {                                                                                           \
+        uint8_t* ptr = image->data.y;                                                           \
+        for( p = 0; p < nplanes; p++ )                                                          \
+            for( y = 0; y < height[p]; y++, ptr += stride[p] )                                  \
+            {                                                                                   \
+                type* tptr = (type*)ptr;                                                        \
+                for( x = 0; x < width[p]; x++ )                                                 \
+                {                                                                               \
+                    uint32_t x_adr = format != VX_DF_IMAGE_U1 ? x : (x / 8);                    \
+                    int   val = CT_RNG_NEXT_INT(*seed, a, b);                                   \
+                    type tval = cast_macro(val);                                                \
+                    tval = format != VX_DF_IMAGE_U1 ? tval :                                    \
+                           (tptr[x_adr] & ~(1 << (x % 8))) | (tval << (x % 8)); /* Set U1 bit */ \
+                    tptr[x_adr] = tval;                                                         \
+                }                                                                               \
+            }                                                                                   \
+    }                                                                                           \
     break
 
     switch( format )
     {
+        CASE_FILL_RNG(VX_DF_IMAGE_U1, uint8_t, CT_CAST_U1);
         CASE_FILL_RNG(VX_DF_IMAGE_U8, uint8_t, CT_CAST_U8);
         CASE_FILL_RNG(VX_DF_IMAGE_U16, uint16_t, CT_CAST_U16);
         CASE_FILL_RNG(VX_DF_IMAGE_S16, int16_t, CT_CAST_S16);
@@ -1160,6 +1365,7 @@
 
     switch (format)
     {
+    case VX_DF_IMAGE_U1:
     case VX_DF_IMAGE_U8:
     case VX_DF_IMAGE_U16:
     case VX_DF_IMAGE_S16:
@@ -1189,6 +1395,7 @@
 {
     switch (format)
     {
+        case VX_DF_IMAGE_U1:
         case VX_DF_IMAGE_U8:
         case VX_DF_IMAGE_U16:
         case VX_DF_IMAGE_S16:
@@ -1217,6 +1424,8 @@
 
     switch (format)
     {
+        case VX_DF_IMAGE_U1:
+            return 0;
         case VX_DF_IMAGE_U8:
             return 1;
         case VX_DF_IMAGE_U16:
@@ -1253,6 +1462,8 @@
 
     switch (format)
     {
+        case VX_DF_IMAGE_U1:
+            return (image->stride + 7) / 8;
         case VX_DF_IMAGE_U8:
             return image->stride;
         case VX_DF_IMAGE_U16:
diff --git a/test_engine/test_image.h b/test_engine/test_image.h
index f00d161..a62d13b 100644
--- a/test_engine/test_image.h
+++ b/test_engine/test_image.h
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -79,6 +79,15 @@
 CT_Image ct_get_image_roi_(CT_Image img, uint32_t x_start, uint32_t y_start, uint32_t width, uint32_t height);
 void ct_adjust_roi(CT_Image img, int left, int top, int right, int bottom);
 
+uint8_t* ct_image_data_ptr_1u(CT_Image image, uint32_t x, uint32_t y);
+#define CT_IMAGE_DATA_PTR_1U(image, x, y) ct_image_data_ptr_1u(image, x, y)
+
+uint8_t ct_image_data_replicate_1u(CT_Image image, int32_t x, int32_t y);
+#define CT_IMAGE_DATA_REPLICATE_1U(image, x, y) ct_image_data_replicate_1u(image, x, y)
+
+uint8_t ct_image_data_constant_1u(CT_Image image, int32_t x, int32_t y, vx_bool constant_value);
+#define CT_IMAGE_DATA_CONSTANT_1U(image, x, y, constant_value) ct_image_data_constant_1u(image, x, y, constant_value)
+
 #if 1
 #define CT_IMAGE_DATA_PTR_8U(image, x, y_) &(image)->data.y[(y_) * (image)->stride + (x)]
 #else
@@ -100,6 +109,23 @@
 #define CT_IMAGE_DATA_PTR_RGBX(image, x, y) &(image)->data.rgbx[(y) * (image)->stride + (x)]
 
 
+#define CT_FILL_IMAGE_1U(ret_error, image, op) \
+    ASSERT_(ret_error, image != NULL); \
+    ASSERT_(ret_error, image->format == VX_DF_IMAGE_U1); \
+    ASSERT_(ret_error, image->width > 0); \
+    ASSERT_(ret_error, image->height > 0); \
+    { \
+        uint32_t x, y; \
+        for (y = 0; y < image->height; y++) { \
+            for (x = 0; x < image->width; x++) { \
+                uint32_t xShftd = x + image->roi.x % 8; /* x respecting start of ROI in first byte */ \
+                uint8_t  offset = xShftd % 8; (void)offset; \
+                uint8_t* dst_data = CT_IMAGE_DATA_PTR_1U(image, xShftd, y); (void)dst_data; \
+                op; \
+            } \
+        } \
+    }
+
 #define CT_FILL_IMAGE_8U(ret_error, image, op) \
     ASSERT_(ret_error, image != NULL); \
     ASSERT_(ret_error, image->format == VX_DF_IMAGE_U8); \
@@ -115,7 +141,6 @@
         } \
     }
 
-
 #define CT_FILL_IMAGE_16S(ret_error, image, op) \
     ASSERT_(ret_error, image != NULL); \
     ASSERT_(ret_error, image->format == VX_DF_IMAGE_S16); \
@@ -161,6 +186,12 @@
 #define ct_image_copyto_vx_image(vximg, ctimg) ct_image_copy_impl(ctimg, vximg, COPY_CT_IMAGE_TO_VX_IMAGE, __FUNCTION__, __FILE__, __LINE__)
 #define ct_image_copyfrom_vx_image(ctimg, vximg) ct_image_copy_impl(ctimg, vximg, COPY_VX_IMAGE_TO_CT_IMAGE, __FUNCTION__, __FILE__, __LINE__)
 
+void U8_ct_image_to_U1_ct_image(CT_Image img_in, CT_Image img_out);
+
+void U1_ct_image_to_U8_ct_image(CT_Image img_in, CT_Image img_out);
+
+void threshold_U8_ct_image(CT_Image img, uint8_t thresh);
+
 #define EXPECT_EQ_CTIMAGE(expected, actual) ct_assert_eq_ctimage_impl(expected, actual, 0, (uint32_t)-1, #expected, #actual, __FUNCTION__, __FILE__, __LINE__)
 #define ASSERT_EQ_CTIMAGE(expected, actual)                                                                                     \
     do { if (ct_assert_eq_ctimage_impl(expected, actual, 0, (uint32_t)-1, #expected, #actual, __FUNCTION__, __FILE__, __LINE__))\
diff --git a/test_engine/test_utils.c b/test_engine/test_utils.c
index d302728..bc78815 100644
--- a/test_engine/test_utils.c
+++ b/test_engine/test_utils.c
@@ -17,6 +17,13 @@
 
 #include <math.h>
 #include <string.h>
+
+#if defined (_WIN32)
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+
 #include "test.h"
 
 // As for OpenVX 1.0 both of following defines result in udefined behavior:
@@ -265,7 +272,15 @@
     }
 
         status = VX_SUCCESS;
-        if (format == VX_DF_IMAGE_U8) // 1 plane of 8-bit data
+        if (format == VX_DF_IMAGE_U1)      // 1 plane of 1-bit data
+            SET_PIXELS(vx_uint8,
+            {
+                vx_uint8 offset = x % 8;
+                vx_uint8 mask = 1 << offset;
+                vx_uint8 rng_val = (vx_uint8)CT_RNG_NEXT_INT(rng, 0, 2) << offset;
+                data[0] = (data[0] & ~mask) | rng_val;
+            })
+        else if (format == VX_DF_IMAGE_U8) // 1 plane of 8-bit data
             SET_PIXELS(vx_uint8,
             {
                 data[0] = (vx_uint8)CT_RNG_NEXT(rng);
@@ -519,6 +534,7 @@
             vx_uint32 elem_sz = 0;
             switch(format)
             {
+                case VX_DF_IMAGE_U1:
                 case VX_DF_IMAGE_U8:
                 case VX_DF_IMAGE_YUV4:
                 case VX_DF_IMAGE_IYUV:
@@ -584,14 +600,37 @@
 
                 for (x = 0; x < w; x++)
                 {
-                    int i_src = x * addr_src.stride_x * addr_src.step_x * addr_src.scale_x / VX_SCALE_UNITY;
-                    int i_dst = x * addr_dst.stride_x * addr_dst.step_x * addr_dst.scale_x / VX_SCALE_UNITY;
+                    int i_src, i_dst, src_offset = 0, dst_offset = 0;
+                    if (format == VX_DF_IMAGE_U1)
+                    {
+                        int x_bits_src = x * addr_src.stride_x_bits * addr_src.step_x * addr_src.scale_x / VX_SCALE_UNITY;
+                        int x_bits_dst = x * addr_dst.stride_x_bits * addr_dst.step_x * addr_dst.scale_x / VX_SCALE_UNITY;
+                        i_src = x_bits_src / 8;
+                        i_dst = x_bits_dst / 8;
+                        src_offset = x_bits_src % 8;
+                        dst_offset = x_bits_dst % 8;
+                    }
+                    else
+                    {
+                        i_src = x * addr_src.stride_x * addr_src.step_x * addr_src.scale_x / VX_SCALE_UNITY;
+                        i_dst = x * addr_dst.stride_x * addr_dst.step_x * addr_dst.scale_x / VX_SCALE_UNITY;
+                    }
 
                     vx_uint8 *psrc = (vx_uint8*)(((vx_uint8 *)base_ptr_src) + j_src + i_src);
                     vx_uint8 *pdst = (vx_uint8*)(((vx_uint8 *)base_ptr_dst) + j_dst + i_dst);
 
                     for(k = 0; k < elem_sz; ++k)
-                        pdst[k] = psrc[k];
+                    {
+                        if (format == VX_DF_IMAGE_U1)
+                        {
+                            vx_uint8 src_val = (psrc[k] & (1 << src_offset)) >> src_offset;
+                            pdst[k] = (pdst[k] & ~(1 << dst_offset)) | (src_val << dst_offset);  // Set target pixel
+                        }
+                        else
+                        {
+                            pdst[k] = psrc[k];
+                        }
+                    }
                 }
             }
 
@@ -782,10 +821,19 @@
     return (uint32_t)(v);
 }
 
+// Integer division with rounding towards minus infinity
+int ct_div_floor(int x, int y) {
+    int q = x / y;
+    int r = x % y;
+    if ( (r != 0) && ((r < 0) != (y < 0)) )
+        --q;
+    return q;
+}
+
 uint8_t ct_clamp_8u(int32_t v)
 {
     if (v >= 255)
-        return v;
+        return 255;
     if (v <= 0)
         return 0;
     return (uint8_t)v;
@@ -1000,13 +1048,22 @@
     *pContext = NULL;
 }
 
-char *ct_get_test_file_path()
+const char *ct_get_test_file_path()
 {
-    char *env = getenv("VX_TEST_DATA_PATH");
+    const char *env = getenv("VX_TEST_DATA_PATH");
     if (env == NULL)
     {
         /* Look in the current directory */
-        env = ".";
+        return ".";
     }
     return env;
 }
+
+void ct_delay_ms(uint32_t ms)
+{
+#if defined (_WIN32)
+    Sleep(ms);
+#else
+    usleep(ms * 1000);
+#endif
+}
diff --git a/test_engine/test_utils.h b/test_engine/test_utils.h
index d7dbf8f..21abd1b 100644
--- a/test_engine/test_utils.h
+++ b/test_engine/test_utils.h
@@ -1,4 +1,4 @@
-/* 
+/*
 
  * Copyright (c) 2012-2017 The Khronos Group Inc.
  *
@@ -19,7 +19,6 @@
 #define __VX_CT_TEST_UTILS_H__
 
 #include <VX/vx.h>
-#include <VX/vx_compatibility.h>
 
 #define MAXPATHLENGTH           (512u)
 
@@ -145,6 +144,12 @@
     CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=127", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 127 }} })), \
     CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=255", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 255 }} }))
 
+#define ADD_VX_BORDERS_U1(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_UNDEFINED", __VA_ARGS__, { VX_BORDER_UNDEFINED, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_REPLICATE", __VA_ARGS__, { VX_BORDER_REPLICATE, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=0", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_CONSTANT=1", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 1 }} }))
+
 #define ADD_VX_BORDERS_REQUIRE_UNDEFINED_ONLY(testArgName, nextmacro, ...) \
     CT_EXPAND(nextmacro(testArgName "/VX_BORDER_UNDEFINED", __VA_ARGS__, { VX_BORDER_UNDEFINED, {{ 0 }} })), \
     CT_EXPAND(nextmacro(testArgName "/DISABLED_VX_BORDER_REPLICATE", __VA_ARGS__, { VX_BORDER_REPLICATE, {{ 0 }} })), \
@@ -153,6 +158,23 @@
     CT_EXPAND(nextmacro(testArgName "/DISABLED_VX_BORDER_CONSTANT=127", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 127 }} })), \
     CT_EXPAND(nextmacro(testArgName "/DISABLED_VX_BORDER_CONSTANT=255", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 255 }} }))
 
+#define ADD_VX_BORDERS_U1_REQUIRE_UNDEFINED_ONLY(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_BORDER_UNDEFINED", __VA_ARGS__, { VX_BORDER_UNDEFINED, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/DISABLED_VX_BORDER_REPLICATE", __VA_ARGS__, { VX_BORDER_REPLICATE, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/DISABLED_VX_BORDER_CONSTANT=0", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 0 }} })), \
+    CT_EXPAND(nextmacro(testArgName "/DISABLED_VX_BORDER_CONSTANT=1", __VA_ARGS__, { VX_BORDER_CONSTANT, {{ 1 }} }))
+
+#define ADD_TYPE_U1(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U1", __VA_ARGS__, VX_DF_IMAGE_U1))
+
+#define ADD_TYPE_U8(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/VX_DF_IMAGE_U8", __VA_ARGS__, VX_DF_IMAGE_U8))
+
+#define ADD_VALID_REGION_SHRINKS(testArgName, nextmacro, ...) \
+    CT_EXPAND(nextmacro(testArgName "/REGION_SHRINK=1", __VA_ARGS__, {1, 1, -1, -1})), \
+    CT_EXPAND(nextmacro(testArgName "/REGION_SHRINK=7", __VA_ARGS__, {7, 7, -7, -7})), \
+    CT_EXPAND(nextmacro(testArgName "/REGION_SHRINK=odd", __VA_ARGS__, {1, 2, -3, -4}))
+
 void ct_fill_image_random_impl(vx_image image, uint64_t* seed, const char* func, const char* file, const int line);
 #define ct_fill_image_random(image, seed) ct_fill_image_random_impl(image, seed, __FUNCTION__, __FILE__, __LINE__)
 
@@ -171,23 +193,34 @@
     vx_image (*generator)(vx_context context, const char* fileName);
 };
 
+#define ALTERRECTANGLE(rectangle, dsx, dsy, dex, dey) \
+{ \
+    rectangle.start_x += dsx; \
+    rectangle.start_y += dsy; \
+    rectangle.end_x   += dex; \
+    rectangle.end_y   += dey; \
+} \
 
 vx_status ct_dump_vx_image_info(vx_image image);
 
 uint32_t ct_floor_u32_no_overflow(float v);
 
+int ct_div_floor(int x, int y);
+
 #define CT_RNG_INIT(rng, seed) ((rng) = (seed) ? (seed) : (uint64_t)(int64_t)(-1))
 #define CT_RNG_NEXT(rng) ((rng) = ((uint64_t)(uint32_t)(rng)*4164903690U + ((rng) >> 32)))
 #define CT_RNG_NEXT_INT(rng, a, b) (int)((uint32_t)CT_RNG_NEXT(rng) % ((b) - (a)) + (a))
 #define CT_RNG_NEXT_BOOL(rng)      CT_RNG_NEXT_INT(rng, 0, 2)
 #define CT_RNG_NEXT_REAL(rng, a, b) ((uint32_t)CT_RNG_NEXT(rng)*(2.3283064365386963e-10*((b) - (a))) + (a))
 
+#define CT_CAST_U1(x)  (uint8_t)((x) < 0 ? 0 : (x) > 1 ? 1 : (x))
 #define CT_CAST_U8(x)  (uint8_t)((x) < 0 ? 0 : (x) > 255 ? 255 : (x))
 #define CT_CAST_U16(x) (uint16_t)((x) < 0 ? 0 : (x) > 65535 ? 65535 : (x))
 #define CT_CAST_S16(x) (int16_t)((x) < -32768 ? -32768 : (x) > 32767 ? 32767 : (x))
 #define CT_CAST_U32(x) (uint32_t)((x) < 0 ? 0 : (x))
 #define CT_CAST_S32(x) (int32_t)(x)
 
+#define CT_SATURATE_U1(x) CT_CAST_U1(x)
 #define CT_SATURATE_U8(x) CT_CAST_U8(x)
 #define CT_SATURATE_U16(x) CT_CAST_U16(x)
 #define CT_SATURATE_S16(x) CT_CAST_S16(x)
@@ -215,12 +248,14 @@
 
 void ct_destroy_vx_context(void **pContext);
 
-char *ct_get_test_file_path();
+const char *ct_get_test_file_path();
 
 void *ct_alloc_mem(size_t size);
 
 void ct_free_mem(void *ptr);
 
+void ct_delay_ms(uint32_t ms);
+
 void ct_memset(void *ptr, vx_uint8 c, size_t);
 void *ct_calloc(size_t nmemb, size_t size);
 
