diff --git a/runtime/src/dllexports b/runtime/src/dllexports
index c99f073f0adfaeca5af9352b834ca913d5e950a1..9631fdcfcc33a6412ee0016eca6bbd2cc891cdfa 100644
--- a/runtime/src/dllexports
+++ b/runtime/src/dllexports
@@ -510,6 +510,8 @@ kmp_set_warnings_off                        780
     omp_set_depend_info                     4002
     omp_task_declare_dependencies           4003
     omp_task_declare_dependencies_noalias   4004
+    omp_task_declare_dependencies_array         4005
+    omp_task_declare_dependencies_array_noalias 4006
     omp_get_num_teams                       865
     omp_get_team_num                        866
     omp_get_cancellation                    867
diff --git a/runtime/src/include/40/omp.h.var b/runtime/src/include/40/omp.h.var
index 3cbf6111069008877fdda8fc34031c2c3837abc8..3840fa0fd885e1b813c5af2376af5ab8616497dd 100644
--- a/runtime/src/include/40/omp.h.var
+++ b/runtime/src/include/40/omp.h.var
@@ -128,6 +128,8 @@
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array( int, int, int, void* );
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array_noalias( int, int, int, void* );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies( int, int, void** );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_noalias( int, int, void** );
 #endif
diff --git a/runtime/src/include/45/omp.h.var b/runtime/src/include/45/omp.h.var
index b606711eaa94cdcbb5c64f481b8c6421e7268662..789832ca04b49a3ccdb5577898432057e7d678cf 100644
--- a/runtime/src/include/45/omp.h.var
+++ b/runtime/src/include/45/omp.h.var
@@ -146,6 +146,8 @@
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array( int, int, int, void* );
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array_noalias( int, int, int, void* );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies( int, int, void** );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_noalias( int, int, void** );
 #endif
diff --git a/runtime/src/include/50/omp.h.var b/runtime/src/include/50/omp.h.var
index b623c7a74af72dcd4cb58643b6671162c3f59eed..69e36c9d9063ad33798e9b347d2d3dd22c20b972 100644
--- a/runtime/src/include/50/omp.h.var
+++ b/runtime/src/include/50/omp.h.var
@@ -146,6 +146,8 @@
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array( int, int, int, void* );
+  extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_array_noalias( int, int, int, void* );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies( int, int, void** );
   extern int __KAI_KMPC_CONVENTION omp_task_declare_dependencies_noalias( int, int, void** );
 #endif
diff --git a/runtime/src/kmp.h b/runtime/src/kmp.h
index 9c27f68012fab6ef7a094b3f1c8ca897c220b983..6f97ab27ecbb65895f74198dbf2dbcd2cf8d6df1 100644
--- a/runtime/src/kmp.h
+++ b/runtime/src/kmp.h
@@ -2284,6 +2284,7 @@ typedef struct kmp_extra_depinfo kmp_extra_depinfo_t;
 /* extra deps from user program store by thread */
 struct kmp_extra_depinfo_th {
   kmp_uint32           ed_size;            // extra dependencies for the next task
+  kmp_uint32           ed_extent;          // extent if ed_mode & OMPEXT_MODE_ARRAY is true
   kmp_uint16           ed_mode;            // access mode
   kmp_uint16           ed_noalias;         // 0 if alias, else 1 if no alias deps
   kmp_intptr_t*        ed_deps;
@@ -3848,6 +3849,8 @@ KMP_EXPORT void __kmpc_end_push_init();
 KMP_EXPORT void __kmpc_omp_set_depend_info(void * addr, kmp_uint32 flag);
 KMP_EXPORT int __kmpc_omp_task_declare_dependencies(  ident_t *loc_ref, kmp_int32 gtid, int, int , void** );
 KMP_EXPORT int __kmpc_omp_task_declare_dependencies_noalias( ident_t *loc_ref, kmp_int32 gtid, int, int, void** );
+KMP_EXPORT int __kmpc_omp_task_declare_dependencies_array(  ident_t *loc_ref, kmp_int32 gtid, int, int, int, void* );
+KMP_EXPORT int __kmpc_omp_task_declare_dependencies_array_noalias( ident_t *loc_ref, kmp_int32 gtid, int, int, int, void* );
 
 KMP_EXPORT void __kmpc_taskgroup(ident_t *loc, int gtid);
 KMP_EXPORT void __kmpc_end_taskgroup(ident_t *loc, int gtid);
diff --git a/runtime/src/kmp_ftn_entry.h b/runtime/src/kmp_ftn_entry.h
index 19720f71cdaf320239d0282b02365528f9f9d1f3..f4d8c6cdb1535513bc92e89f1092ec9ef524bb91 100644
--- a/runtime/src/kmp_ftn_entry.h
+++ b/runtime/src/kmp_ftn_entry.h
@@ -618,6 +618,25 @@ FN_TASK_DECLDEPS_NOALIAS( int mode, int count, void** array)
         return __kmpc_omp_task_declare_dependencies_noalias(0, __kmp_entry_gtid(), mode, count, array);
     #endif
 }
+int FTN_STDCALL
+FN_TASK_DECLDEPS_ARRAY( int mode, int count, int extent, void** array)
+{
+    #ifdef KMP_STUB
+        return __kmpc_omp_task_declare_dependencies_array(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #else
+        return __kmpc_omp_task_declare_dependencies_array(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #endif
+}
+
+int FTN_STDCALL
+FN_TASK_DECLDEPS_ARRAY_NOALIAS( int mode, int count, int extent, void** array)
+{
+    #ifdef KMP_STUB
+        return __kmpc_omp_task_declare_dependencies_array_noalias(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #else
+        return __kmpc_omp_task_declare_dependencies_array_noalias(0, __kmp_entry_gtid(), mode, count, extent, array);
+    #endif
+}
 #endif
 
 kmp_proc_bind_t FTN_STDCALL xexpand(FTN_GET_PROC_BIND)(void) {
diff --git a/runtime/src/kmp_ftn_os.h b/runtime/src/kmp_ftn_os.h
index ca3aee39261f16a744419e8962e9ad9466a42bcb..95eaf02dc890102fc6a90d9f07dc9fc92484f35d 100644
--- a/runtime/src/kmp_ftn_os.h
+++ b/runtime/src/kmp_ftn_os.h
@@ -83,6 +83,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS omp_task_declare_dependencies
 #define FN_TASK_DECLDEPS_NOALIAS omp_task_declare_dependencies_noalias
+#define FN_TASK_DECLDEPS_ARRAY omp_task_declare_dependencies_array
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS omp_task_declare_dependencies_array_noalias
 #endif
 #define FTN_GET_NUM_TEAMS omp_get_num_teams
 #define FTN_GET_TEAM_NUM omp_get_team_num
@@ -208,6 +210,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS omp_task_declare_dependencies_
 #define FN_TASK_DECLDEPS_NOALIAS omp_task_declare_dependencies_noalias_
+#define FN_TASK_DECLDEPS_ARRAY omp_task_declare_dependencies_array_
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS omp_task_declare_dependencies_array_noalias_
 #endif
 #define FTN_GET_NUM_TEAMS omp_get_num_teams_
 #define FTN_GET_TEAM_NUM omp_get_team_num_
@@ -334,6 +338,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS OMP_TASK_DECLARE_DEPENDENCIES
 #define FN_TASK_DECLDEPS_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_NOALIAS
+#define FN_TASK_DECLDEPS_ARRAY OMP_TASK_DECLARE_DEPENDENCIES_ARRAY
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_ARRAY_NOALIAS
 #endif
 #define FTN_GET_NUM_TEAMS OMP_GET_NUM_TEAMS
 #define FTN_GET_TEAM_NUM OMP_GET_TEAM_NUM
@@ -460,6 +466,8 @@
 #if LIBOMP_USE_VARDEP
 #define FN_TASK_DECLDEPS OMP_TASK_DECLARE_DEPENDENCIES_
 #define FN_TASK_DECLDEPS_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_NOALIAS_
+#define FN_TASK_DECLDEPS_ARRAY OMP_TASK_DECLARE_DEPENDENCIES_ARRAY_
+#define FN_TASK_DECLDEPS_ARRAY_NOALIAS OMP_TASK_DECLARE_DEPENDENCIES_ARRAY_NOALIAS_
 #endif
 #define FTN_GET_NUM_TEAMS OMP_GET_NUM_TEAMS_
 #define FTN_GET_TEAM_NUM OMP_GET_TEAM_NUM_
diff --git a/runtime/src/kmp_taskdeps.cpp b/runtime/src/kmp_taskdeps.cpp
index 95c0c38c309dd10ccb4766053653ee2d9476fa49..0467c96ddf54f76e2176d3d18aeb66e561f763db 100644
--- a/runtime/src/kmp_taskdeps.cpp
+++ b/runtime/src/kmp_taskdeps.cpp
@@ -917,6 +917,7 @@ static int kmp_add_extradeps( kmp_info_t *thread, int kind,
 #define OMPEXT_MODE_WRITE      2
 #define OMPEXT_MODE_READWRITE  3
 #define OMPEXT_MODE_CONCURRENT 4
+#define OMPEXT_MODE_ARRAY      (1<<8)
 
   kmp_extra_depinfo_th_t* bloc;
   if (thread->th.th_edeps_tail[kind] !=0)
@@ -925,6 +926,7 @@ static int kmp_add_extradeps( kmp_info_t *thread, int kind,
     bloc = &thread->th.th_edeps[kind];
 
   bloc->ed_size    = count;
+  bloc->ed_extent  = 0;
   bloc->ed_deps    = (kmp_intptr_t*)array;
   bloc->ed_mode    = (kmp_uint16)mode;
   bloc->ed_noalias = kind;
@@ -936,6 +938,29 @@ static int kmp_add_extradeps( kmp_info_t *thread, int kind,
   return 0;
 }
 
+/* */
+static int kmp_add_extradeps_array( kmp_info_t *thread, int kind,
+                                    int mode, int count, int extent, void* array)
+{
+  kmp_extra_depinfo_th_t* bloc;
+  if (thread->th.th_edeps_tail[kind] !=0)
+    bloc = (kmp_extra_depinfo_th_t*)__kmp_fast_allocate(thread, sizeof(kmp_extra_depinfo_th_t));
+  else
+    bloc = &thread->th.th_edeps[kind];
+
+  bloc->ed_size    = count;
+  bloc->ed_extent  = extent;
+  bloc->ed_deps    = (kmp_intptr_t*)array;
+  bloc->ed_mode    = OMPEXT_MODE_ARRAY|(kmp_uint16)mode;
+  bloc->ed_noalias = kind;
+  bloc->ed_next    = 0;
+  if (thread->th.th_edeps_tail[kind] !=0)
+    thread->th.th_edeps_tail[kind]->ed_next = bloc;
+  thread->th.th_edeps_tail[kind] = bloc;
+  thread->th.th_edps_size[kind] += count;
+  return 0;
+}
+
 
 /* */
 int __kmpc_omp_task_declare_dependencies( ident_t *loc_ref, kmp_int32 gtid,
@@ -975,6 +1000,45 @@ int __kmpc_omp_task_declare_dependencies_noalias( ident_t *loc_ref, kmp_int32 gt
 #endif
   return kmp_add_extradeps(thread, 1 /* no alias */, mode, count, array );
 }
+
+int __kmpc_omp_task_declare_dependencies_array( ident_t *loc_ref, kmp_int32 gtid,
+                                          int mode, int count, int extent, void* array)
+{
+  kmp_info_t *thread = __kmp_threads[ gtid ];
+  if (array==0) return EINVAL;
+  if (count<0) return EINVAL;
+#ifdef KMP_DEBUG
+  KMP_ASSERT( !((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT)) );
+#else
+  if ((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT))
+  {
+    printf("***error invalid access mode: %i\n", mode );
+    return EINVAL;
+  }
+#endif
+  return kmp_add_extradeps_array(thread, 0 /* alias */, mode, count, extent, array );
+}
+
+
+/* */
+int __kmpc_omp_task_declare_dependencies_array_noalias( ident_t *loc_ref, kmp_int32 gtid,
+                                                  int mode, int count, int extent, void* array)
+{
+  kmp_info_t *thread = __kmp_threads[ gtid ];
+  if (array==0) return EINVAL;
+  if (count<0) return EINVAL;
+#ifdef KMP_DEBUG
+  KMP_ASSERT( !((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT)) );
+#else
+  if ((mode<OMPEXT_MODE_READ)||(mode >OMPEXT_MODE_CONCURRENT))
+  {
+    printf("***error invalid access mode: %i\n", mode );
+    return EINVAL;
+  }
+#endif
+  return kmp_add_extradeps_array(thread, 1 /* no alias */, mode, count, extent, array );
+}
+
 #endif
 
 
@@ -1070,7 +1134,10 @@ kmp_int32 __kmpc_omp_task_with_deps(ident_t *loc_ref, kmp_int32 gtid,
       flags.alias = 0;
       for (i=0; i<bloc->ed_size; ++i, ++deps)
       {
-        deps->base_addr = bloc->ed_deps[i];
+        if (bloc->ed_mode & OMPEXT_MODE_ARRAY)
+          deps->base_addr = (kmp_intptr_t)(bloc->ed_extent*i+(unsigned char*)bloc->ed_deps);
+        else
+          deps->base_addr = bloc->ed_deps[i];
         deps->len       = 1;
         deps->flags     = flags;
       }
@@ -1098,7 +1165,10 @@ kmp_int32 __kmpc_omp_task_with_deps(ident_t *loc_ref, kmp_int32 gtid,
       flags.alias = 0;
       for (i=0; i<bloc->ed_size; ++i, ++deps)
       {
-        deps->base_addr = bloc->ed_deps[i];
+        if (bloc->ed_mode & OMPEXT_MODE_ARRAY)
+          deps->base_addr = (kmp_intptr_t)(bloc->ed_extent*i+(unsigned char*)bloc->ed_deps);
+        else
+          deps->base_addr = bloc->ed_deps[i];
         deps->len       = 1;
         deps->flags     = flags;
       }