diff --git a/compiler2/Type.cc b/compiler2/Type.cc
index 94757c41f73e6a92e7c485802519f4f888d44c0e..b2c4f7d5d71e9366880998b9ce38b2c1eb49c861 100644
--- a/compiler2/Type.cc
+++ b/compiler2/Type.cc
@@ -1703,7 +1703,58 @@ namespace Common {
         }
         // check the index value
         Value *index_value = ref->get_val();
-        if (t->typetype == T_ARRAY) {
+        index_value->set_lowerid_to_ref();
+        
+        // pt is the type with the indexing is made, while t is the type on the
+        // indexing is applied.
+        Type* pt = index_value->get_expr_governor_last();
+        if (pt != NULL &&
+          // The indexer type is an array or record of
+           (pt->get_typetype() == T_ARRAY || pt->get_typetype() == T_SEQOF) &&
+          // The indexed type is a record of or set of or array
+           (t->get_typetype() == T_SEQOF || t->get_typetype() == T_SETOF || t->get_typetype() == T_ARRAY)) {
+          
+          // The indexer type must be of type integer
+          if (pt->get_ofType()->get_type_refd_last()->get_typetype() != T_INT) {
+            ref->error("Only fixed length array or record of integer types are allowed for short-hand notation for nested indexes.");
+            return 0;
+          }
+          int len = 0;
+          // Get the length of the array or record of
+          if (pt->get_typetype() == T_ARRAY) {
+            len = (int)pt->get_dimension()->get_size();
+          } else if (pt->get_typetype() == T_SEQOF) {
+            SubType* sub = pt->get_sub_type();
+            if (sub == NULL) {
+              ref->error("The type `%s' must have single size length restriction when used as a short-hand notation for nested indexes.",
+                pt->get_typename().c_str());
+              return 0;
+            }
+            len = pt->get_sub_type()->get_length_restriction();
+            if (len == -1) {
+              ref->error("The type `%s' must have single size length restriction when used as a short-hand notation for nested indexes.",
+                pt->get_typename().c_str());
+              return 0;
+            }
+          }
+          embedded_type = embedded_type->get_type_refd_last();
+          int j = 0;
+          // Get the len - 1'th inner type
+          while (j < len - 1) {
+            switch (embedded_type->get_typetype()) {
+              case T_SEQOF:
+              case T_SETOF:
+              case T_ARRAY:
+                embedded_type = embedded_type->get_ofType()->get_type_refd_last();
+                break;
+              default:
+                ref->error("The type `%s' contains too many indexes (%i) in the short-hand notation for nested indexes.",
+                  pt->get_typename().c_str(), len);
+                return 0;
+            }
+            j++;
+          }
+        } else if (t->typetype == T_ARRAY) {
           // checking of array index is performed by the array dimension
           t->u.array.dimension->chk_index(index_value, expected_index);
         } else {
diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc
index fdd64d15229f945d321e17be690ab86de53c6ca8..1a81106363a1293e82b549f277fb0501ba9d1ba5 100644
--- a/compiler2/ttcn3/AST_ttcn3.cc
+++ b/compiler2/ttcn3/AST_ttcn3.cc
@@ -369,9 +369,29 @@ namespace Ttcn {
         }
       } else {
         // Generate code for array reference.
-        expr->expr = mputc(expr->expr, '[');
-        ref->get_val()->generate_code_expr(expr);
-        expr->expr = mputc(expr->expr, ']');
+        Value* v = ref->get_val();
+        Type * pt = v->get_expr_governor_last();
+        // If the value is indexed with an array or record of then generate
+        // the indexes of the array or record of into the code, one by one.
+        if (pt->get_typetype() == Type::T_ARRAY || pt->get_typetype() == Type::T_SEQOF) {
+          int len = 0, start = 0;
+          if (pt->get_typetype() == Type::T_ARRAY) {
+            len = (int)pt->get_dimension()->get_size();
+            start = pt->get_dimension()->get_offset();
+          } else if (pt->get_typetype() == Type::T_SEQOF) {
+            len = pt->get_sub_type()->get_length_restriction();
+          }
+          // Generate the indexes as [x][y]...
+          for (int j = start; j < start + len; j++) {
+            expr->expr = mputc(expr->expr, '[');
+            v->generate_code_expr(expr);
+            expr->expr = mputprintf(expr->expr, "[%i]]", j);
+          }
+        } else {
+          expr->expr = mputc(expr->expr, '[');
+          v->generate_code_expr(expr);
+          expr->expr = mputc(expr->expr, ']');
+        }
         if (type) {
           // Follow the embedded type.
           switch (type->get_typetype()) {
diff --git a/function_test/Semantic_Analyser/Makefile.semantic b/function_test/Semantic_Analyser/Makefile.semantic
index da579923da1a258d05d89bf93d9e58dc5846d33d..b1b87e0f08012cb4d618e3595b14305e1634fb03 100644
--- a/function_test/Semantic_Analyser/Makefile.semantic
+++ b/function_test/Semantic_Analyser/Makefile.semantic
@@ -12,7 +12,7 @@
 #   Szabo, Bence Janos
 #
 ##############################################################################
-SADIRS := ver xer encode param template any_from pattern_ref float
+SADIRS := ver xer encode param template any_from pattern_ref float recof_index
 ifeq ($(RT2), yes)
 SADIRS += deprecated
 endif
diff --git a/function_test/Semantic_Analyser/recof_index/Makefile b/function_test/Semantic_Analyser/recof_index/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..895b6a5b94888a0f8c7dd0d149825c99ec6fcc4d
--- /dev/null
+++ b/function_test/Semantic_Analyser/recof_index/Makefile
@@ -0,0 +1,12 @@
+##############################################################################
+# Copyright (c) 2000-2016 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Bence Janos Szabo
+#
+##############################################################################
+include ../common.mk
diff --git a/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn b/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn
new file mode 100644
index 0000000000000000000000000000000000000000..42fc6cfcea51c325a54831f9b25923eb1681e5b3
--- /dev/null
+++ b/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn
@@ -0,0 +1,50 @@
+/******************************************************************************
+ * Copyright (c) 2000-2016 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Szabo, Bence Janos
+ *
+ ******************************************************************************/
+module recof_index_SE { //^In TTCN-3 module//
+
+  type record of record of integer RoRoI;
+  type record length(1..2) of integer RoI1;
+  type record length(3) of integer RoI2;
+  type record of integer RoI;
+
+  type record length(1) of float RoF1;
+
+  function f() { //^In function definition `f'//
+    var RoRoI v_rec := {{0, 1}, {2, 3}};
+    var RoI1 v_index := { 1 }
+	if (v_rec[v_index] == {2, 3}) { //^In if statement:// //error: The type \`@recof_index_SE\.RoI1\' must have single size length restriction when used as a short-hand notation for nested indexes\.//
+	}
+
+    var RoI2 v_index2 := { 1, 2, 3 }
+	if (v_rec[v_index2] == {2, 3}) { //^In if statement:// //error: The type \`@recof_index_SE.RoI2\' contains too many indexes \(3\) in the short-hand notation for nested indexes\.//
+	}
+
+	var integer v_arr[3] := { 1, 2, 3 }
+	if (v_rec[v_arr] == {2, 3}) { //^In if statement:// //error: The type \`integer\[3\]\' contains too many indexes \(3\) in the short-hand notation for nested indexes\.//
+	}
+
+	var RoF1 v_index3 := { 1.0 }
+	if (v_rec[v_index3] == {2, 3}) { //^In if statement:// //error\: Only fixed length array or record of integer types are allowed for short\-hand notation for nested indexes\.//
+	}
+
+	var integer v_arr2[0] := { } //In variable definition \`v_arr2\'\:// //error\: A positive integer value was expected as array size instead of \`0\'//
+	if (v_rec[v_arr2] == {2, 3}) {
+	}
+
+	var RoI v_index4 := { 1, 1 }
+	if (v_rec[v_index4] == {2, 3}) { //^In if statement:// //error\: The type \`\@recof_index_SE\.RoI\' must have single size length restriction when used as a short\-hand notation for nested indexes\.//
+	}
+
+  }
+
+
+}
diff --git a/function_test/Semantic_Analyser/recof_index/t b/function_test/Semantic_Analyser/recof_index/t
new file mode 100755
index 0000000000000000000000000000000000000000..3a4b58ec16cf2f1390a36c7a92f8823e3b94b425
--- /dev/null
+++ b/function_test/Semantic_Analyser/recof_index/t
@@ -0,0 +1,9 @@
+#!/usr/bin/perl
+# note this is called through "perl -w"
+use strict;
+
+my $self = $0;
+$self =~ s!/t!!;
+
+exec('make check --no-print-directory -s -C ' . $self);
+
diff --git a/regression_test/Makefile b/regression_test/Makefile
index 274622c4f26272c1021aecec4efa4d8844673443..812f0f1850d40be175a0412fddcc1daa6d434400 100644
--- a/regression_test/Makefile
+++ b/regression_test/Makefile
@@ -47,7 +47,7 @@ macros visibility hexstrOper ucharstrOper objidOper CRTR00015758 slider \
 XML ipv6 implicitOmit testcase_defparam transparent HQ16404 cfgFile \
 all_from lazyEval tryCatch text2ttcn json junitlogger ttcn2json profiler templateOmit \
 customEncoding makefilegen uidChars checkstate hostid templateIstemplatekind \
-selectUnion templateExclusiveRange any_from templatePatternRef
+selectUnion templateExclusiveRange any_from templatePatternRef indexWithRecofArray
 
 ifdef DYN
 DIRS += loggerplugin
diff --git a/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn b/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn
new file mode 100644
index 0000000000000000000000000000000000000000..c759c8b8c2fc226f48702b26dc57a01f4e1763bb
--- /dev/null
+++ b/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn
@@ -0,0 +1,1688 @@
+/******************************************************************************
+ * Copyright (c) 2000-2016 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Szabo, Bence Janos
+ *
+ ******************************************************************************/
+
+module IndexWithRecofArray {
+
+	type component GeneralComp {	    	    
+	}
+ 
+
+	type record of record of integer RoRoI;
+	type record of record of RoRoI RoIRoIRoIRoI;
+	type set of set of integer SoISoI;
+	type set of set of SoISoI SoISoISoISoI
+	type record length(1) of  integer  RoI1;
+	type record length(2) of  integer  RoI2;
+
+
+//###########################################################################//
+// Record of indexed with array or record of
+	
+	testcase tc_recordof_indexed_with_array() runs on GeneralComp {
+
+		var RoRoI v_rec := {{0, 1}, {2, 3}};
+        var integer v_index[1] := { 1 }
+
+////////////////////////////////////////////////////
+
+		if (v_rec[v_index] == {2, 3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index] := {5, 6};
+		if (v_rec[v_index] == {5, 6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index] := {2, 3};
+
+////////////////////////////////////////////////////
+
+
+		if (v_rec[v_index][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index][0] := 99;
+		if (v_rec[v_index][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index][0] := 2;
+
+////////////////////////////////////////////////////
+
+		if (v_rec[0][v_index] == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[0][v_index] := 99;
+		if (v_rec[0][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[0][v_index] := 1;
+
+
+////////////////////////////////////////////////////
+
+
+		if (v_rec[v_index][v_index] == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index][v_index] := 99;
+		if (v_rec[v_index][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index][v_index] := 3;
+
+////////////////////////////////////////////////////		
+
+        var integer v_index2[2] := {1, 0};
+        if (v_rec[v_index2] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index2] := 99;
+		if (v_rec[v_index2] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index2] := 2;
+	}
+
+	testcase tc_recordof_indexed_with_recordof() runs on GeneralComp {
+
+		var RoRoI v_rec := {{0, 1}, {2, 3}};
+        var RoI1 v_index := { 1 }
+		////////////////////////////////////////////////////
+
+		if (v_rec[v_index] == {2, 3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index] := {5, 6};
+		if (v_rec[v_index] == {5, 6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index] := {2, 3};
+
+////////////////////////////////////////////////////
+
+
+		if (v_rec[v_index][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index][0] := 99;
+		if (v_rec[v_index][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index][0] := 2;
+
+////////////////////////////////////////////////////
+
+		if (v_rec[0][v_index] == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[0][v_index] := 99;
+		if (v_rec[0][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[0][v_index] := 1;
+
+
+////////////////////////////////////////////////////
+
+
+		if (v_rec[v_index][v_index] == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index][v_index] := 99;
+		if (v_rec[v_index][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index][v_index] := 3;
+
+////////////////////////////////////////////////////		
+
+        var integer v_index2[2] := {1, 0};
+        if (v_rec[v_index2] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index2] := 99;
+		if (v_rec[v_index2] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index2] := 2;
+	}
+
+	testcase tc_recordof_indexed_with_recordof_and_array() runs on GeneralComp {
+		var RoIRoIRoIRoI v_rec := {
+			{
+				{
+					{0, 1},
+					{2, 3}
+				},
+				{
+					{4, 5},
+					{6, 7}
+				}
+			},
+			{
+				{
+					{8, 9},
+					{10, 11}
+				},
+				{
+					{12, 13},
+					{14, 15}
+				}
+			}
+		}
+		var integer v_index[1] := {0};
+		var integer v_index2[2] := {0, 1};
+		var RoI1 v_roi1 := {0};
+		var RoI2 v_roi2 := {0, 1};
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[v_index][v_index2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index][v_index2][v_index] := 99;
+		if (v_rec[v_index][v_index2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index][v_index2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[v_index][v_index2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index][v_index2][0] := 99;
+		if (v_rec[v_index][v_index2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index][v_index2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[v_index][0][1][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_index][0][1][v_index] := 99;
+		if (v_rec[v_index][0][1][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_index][0][1][v_index] := 2;
+
+////////////////////////////////////////////////////
+
+		// [0][0][1][0]
+		if (v_rec[v_roi1][v_index2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][v_index2][v_index] := 99;
+		if (v_rec[v_roi1][v_index2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][v_index2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[v_roi1][v_roi2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][v_roi2][v_index] := 99;
+		if (v_rec[v_roi1][v_roi2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][v_roi2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[v_roi1][v_roi2][v_roi1] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][v_roi2][v_roi1] := 99;
+		if (v_rec[v_roi1][v_roi2][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][v_roi2][v_roi1] := 2;
+
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[v_roi1][v_roi2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][v_roi2][0] := 99;
+		if (v_rec[v_roi1][v_roi2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][v_roi2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[0][v_roi2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[0][v_roi2][0] := 99;
+		if (v_rec[0][v_roi2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[0][v_roi2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_rec[v_roi1][0][1][v_roi1] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][0][1][v_roi1] := 99;
+		if (v_rec[v_roi1][0][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][0][1][v_roi1] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_rec[v_roi1][1][1][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][1][1][v_roi1] := 99;
+		if (v_rec[v_roi1][1][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][1][1][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_rec[v_roi1][v_roi2[1]][1][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][v_roi2[1]][1][v_roi1] := 99;
+		if (v_rec[v_roi1][v_roi2[1]][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][v_roi2[1]][1][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_rec[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] := 99;
+		if (v_rec[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [1][0][1][1]
+		if (v_rec[v_roi2[1]][v_index2][v_index2[1]] == 11) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_rec[v_roi2[1]][v_index2][v_index2[1]] := 99;
+		if (v_rec[v_roi2[1]][v_index2][v_index2[1]] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_rec[v_roi2[1]][v_index2][v_index2[1]] := 11;
+	}
+
+
+//###########################################################################//
+// Set of indexed with array or record of
+
+
+	testcase tc_setof_indexed_with_array() runs on GeneralComp {
+
+		var SoISoI v_set := {{0, 1}, {2, 3}};
+        var integer v_index[1] := { 1 }
+////////////////////////////////////////////////////
+
+		if (v_set[v_index] == {2, 3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index] := {5, 6};
+		if (v_set[v_index] == {5, 6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index] := {2, 3};
+
+////////////////////////////////////////////////////
+
+
+		if (v_set[v_index][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index][0] := 99;
+		if (v_set[v_index][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index][0] := 2;
+
+////////////////////////////////////////////////////
+
+		if (v_set[0][v_index] == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[0][v_index] := 99;
+		if (v_set[0][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[0][v_index] := 1;
+
+
+////////////////////////////////////////////////////
+
+
+		if (v_set[v_index][v_index] == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index][v_index] := 99;
+		if (v_set[v_index][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index][v_index] := 3;
+
+////////////////////////////////////////////////////		
+
+        var integer v_index2[2] := {1, 0};
+        if (v_set[v_index2] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index2] := 99;
+		if (v_set[v_index2] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index2] := 2;
+	}
+
+	testcase tc_setof_indexed_with_recordof() runs on GeneralComp {
+
+		var SoISoI v_set := {{0, 1}, {2, 3}};
+        var RoI1 v_index := { 1 }
+////////////////////////////////////////////////////
+
+		if (v_set[v_index] == {2, 3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index] := {5, 6};
+		if (v_set[v_index] == {5, 6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index] := {2, 3};
+
+////////////////////////////////////////////////////
+
+
+		if (v_set[v_index][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index][0] := 99;
+		if (v_set[v_index][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index][0] := 2;
+
+////////////////////////////////////////////////////
+
+		if (v_set[0][v_index] == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[0][v_index] := 99;
+		if (v_set[0][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[0][v_index] := 1;
+
+
+////////////////////////////////////////////////////
+
+
+		if (v_set[v_index][v_index] == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index][v_index] := 99;
+		if (v_set[v_index][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index][v_index] := 3;
+
+////////////////////////////////////////////////////		
+
+        var integer v_index2[2] := {1, 0};
+        if (v_set[v_index2] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index2] := 99;
+		if (v_set[v_index2] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index2] := 2;
+	}
+
+	testcase tc_setof_indexed_with_recordof_and_array() runs on GeneralComp {
+		var SoISoISoISoI v_set := {
+			{
+				{
+					{0, 1},
+					{2, 3}
+				},
+				{
+					{4, 5},
+					{6, 7}
+				}
+			},
+			{
+				{
+					{8, 9},
+					{10, 11}
+				},
+				{
+					{12, 13},
+					{14, 15}
+				}
+			}
+		}
+		var integer v_index[1] := {0};
+		var integer v_index2[2] := {0, 1};
+		var RoI1 v_roi1 := {0};
+		var RoI2 v_roi2 := {0, 1};
+
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[v_index][v_index2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index][v_index2][v_index] := 99;
+		if (v_set[v_index][v_index2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index][v_index2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[v_index][v_index2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index][v_index2][0] := 99;
+		if (v_set[v_index][v_index2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index][v_index2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[v_index][0][1][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_index][0][1][v_index] := 99;
+		if (v_set[v_index][0][1][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_index][0][1][v_index] := 2;
+
+////////////////////////////////////////////////////
+
+		// [0][0][1][0]
+		if (v_set[v_roi1][v_index2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][v_index2][v_index] := 99;
+		if (v_set[v_roi1][v_index2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][v_index2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[v_roi1][v_roi2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][v_roi2][v_index] := 99;
+		if (v_set[v_roi1][v_roi2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][v_roi2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[v_roi1][v_roi2][v_roi1] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][v_roi2][v_roi1] := 99;
+		if (v_set[v_roi1][v_roi2][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][v_roi2][v_roi1] := 2;
+
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[v_roi1][v_roi2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][v_roi2][0] := 99;
+		if (v_set[v_roi1][v_roi2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][v_roi2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[0][v_roi2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[0][v_roi2][0] := 99;
+		if (v_set[0][v_roi2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[0][v_roi2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_set[v_roi1][0][1][v_roi1] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][0][1][v_roi1] := 99;
+		if (v_set[v_roi1][0][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][0][1][v_roi1] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_set[v_roi1][1][1][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][1][1][v_roi1] := 99;
+		if (v_set[v_roi1][1][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][1][1][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_set[v_roi1][v_roi2[1]][1][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][v_roi2[1]][1][v_roi1] := 99;
+		if (v_set[v_roi1][v_roi2[1]][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][v_roi2[1]][1][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_set[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] := 99;
+		if (v_set[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [1][0][1][1]
+		if (v_set[v_roi2[1]][v_index2][v_index2[1]] == 11) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_set[v_roi2[1]][v_index2][v_index2[1]] := 99;
+		if (v_set[v_roi2[1]][v_index2][v_index2[1]] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_set[v_roi2[1]][v_index2][v_index2[1]] := 11;
+	}
+
+
+//###########################################################################//
+// Array indexed with array or record of
+
+
+	testcase tc_array_indexed_with_array() runs on GeneralComp {
+		var integer v_arr[2][2] := {{0, 1}, {2, 3}};
+		var integer v_index[1] := { 1 }
+////////////////////////////////////////////////////
+
+		if (v_arr[v_index] == {2, 3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index] := {5, 6};
+		if (v_arr[v_index] == {5, 6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index] := {2, 3};
+
+////////////////////////////////////////////////////
+
+
+		if (v_arr[v_index][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][0] := 99;
+		if (v_arr[v_index][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][0] := 2;
+
+////////////////////////////////////////////////////
+
+		if (v_arr[0][v_index] == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[0][v_index] := 99;
+		if (v_arr[0][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[0][v_index] := 1;
+
+
+////////////////////////////////////////////////////
+
+
+		if (v_arr[v_index][v_index] == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][v_index] := 99;
+		if (v_arr[v_index][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][v_index] := 3;
+
+////////////////////////////////////////////////////		
+
+        var integer v_index2[2] := {1, 0};
+        if (v_arr[v_index2] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index2] := 99;
+		if (v_arr[v_index2] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index2] := 2;
+	}
+
+		testcase tc_array_indexed_with_recordof() runs on GeneralComp {
+		var integer v_arr[2][2] := {{0, 1}, {2, 3}};
+		var RoI1 v_index := { 1 }
+////////////////////////////////////////////////////
+
+		if (v_arr[v_index] == {2, 3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index] := {5, 6};
+		if (v_arr[v_index] == {5, 6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index] := {2, 3};
+
+////////////////////////////////////////////////////
+
+
+		if (v_arr[v_index][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][0] := 99;
+		if (v_arr[v_index][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][0] := 2;
+
+////////////////////////////////////////////////////
+
+		if (v_arr[0][v_index] == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[0][v_index] := 99;
+		if (v_arr[0][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[0][v_index] := 1;
+
+
+////////////////////////////////////////////////////
+
+
+		if (v_arr[v_index][v_index] == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][v_index] := 99;
+		if (v_arr[v_index][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][v_index] := 3;
+
+////////////////////////////////////////////////////		
+
+        var integer v_index2[2] := {1, 0};
+        if (v_arr[v_index2] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index2] := 99;
+		if (v_arr[v_index2] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index2] := 2;
+	}
+
+
+		testcase tc_array_indexed_with_recordof_and_array() runs on GeneralComp {
+		var integer v_arr[2][2][2][2] := {
+			{
+				{
+					{0, 1},
+					{2, 3}
+				},
+				{
+					{4, 5},
+					{6, 7}
+				}
+			},
+			{
+				{
+					{8, 9},
+					{10, 11}
+				},
+				{
+					{12, 13},
+					{14, 15}
+				}
+			}
+		}
+		var integer v_index[1] := {0};
+		var integer v_index2[2] := {0, 1};
+		var RoI1 v_roi1 := {0};
+		var RoI2 v_roi2 := {0, 1};
+
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[v_index][v_index2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][v_index2][v_index] := 99;
+		if (v_arr[v_index][v_index2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][v_index2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[v_index][v_index2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][v_index2][0] := 99;
+		if (v_arr[v_index][v_index2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][v_index2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[v_index][0][1][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][0][1][v_index] := 99;
+		if (v_arr[v_index][0][1][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][0][1][v_index] := 2;
+
+////////////////////////////////////////////////////
+
+		// [0][0][1][0]
+		if (v_arr[v_roi1][v_index2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][v_index2][v_index] := 99;
+		if (v_arr[v_roi1][v_index2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][v_index2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[v_roi1][v_roi2][v_index] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][v_roi2][v_index] := 99;
+		if (v_arr[v_roi1][v_roi2][v_index] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][v_roi2][v_index] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[v_roi1][v_roi2][v_roi1] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][v_roi2][v_roi1] := 99;
+		if (v_arr[v_roi1][v_roi2][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][v_roi2][v_roi1] := 2;
+
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[v_roi1][v_roi2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][v_roi2][0] := 99;
+		if (v_arr[v_roi1][v_roi2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][v_roi2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[0][v_roi2][0] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[0][v_roi2][0] := 99;
+		if (v_arr[0][v_roi2][0] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[0][v_roi2][0] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][0][1][0]
+		if (v_arr[v_roi1][0][1][v_roi1] == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][0][1][v_roi1] := 99;
+		if (v_arr[v_roi1][0][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][0][1][v_roi1] := 2;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_arr[v_roi1][1][1][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][1][1][v_roi1] := 99;
+		if (v_arr[v_roi1][1][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][1][1][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_arr[v_roi1][v_roi2[1]][1][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][v_roi2[1]][1][v_roi1] := 99;
+		if (v_arr[v_roi1][v_roi2[1]][1][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][v_roi2[1]][1][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [0][1][1][0]
+		if (v_arr[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] := 99;
+		if (v_arr[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi1][v_roi2[1]][v_index2[1]][v_roi1] := 6;
+
+////////////////////////////////////////////////////	
+
+		// [1][0][1][1]
+		if (v_arr[v_roi2[1]][v_index2][v_index2[1]] == 11) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_roi2[1]][v_index2][v_index2[1]] := 99;
+		if (v_arr[v_roi2[1]][v_index2][v_index2[1]] == 99) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_roi2[1]][v_index2][v_index2[1]] := 11;
+
+	}
+
+
+//###########################################################################//
+// Array of charstring indexed with record of
+
+	testcase tc_arrayfstr_indexed_with_recordof() runs on GeneralComp {
+		var charstring v_arr[2][2] := {{"a", "b"}, {"c", "d"}};
+		var RoI1 v_index := { 1 }
+
+////////////////////////////////////////////////////
+
+		if (v_arr[v_index] == {"c", "d"}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index] := {"x", "y"};
+		if (v_arr[v_index] == {"x", "y"}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index] := {"c", "d"};
+
+////////////////////////////////////////////////////		
+
+		if (v_arr[v_index][0] == "c") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][0] := "x";
+		if (v_arr[v_index][0] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][0] := "c";
+
+////////////////////////////////////////////////////
+
+		if (v_arr[0][v_index] == "b") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[0][v_index] := "x";
+		if (v_arr[0][v_index] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[0][v_index] := "b";
+
+////////////////////////////////////////////////////
+
+		if (v_arr[v_index][v_index] == "d") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][v_index] := "x";
+		if (v_arr[v_index][v_index] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][v_index] := "d";
+
+////////////////////////////////////////////////////
+
+        var RoI2 v_index2 := {1, 0};
+        if (v_arr[v_index2] == "c") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index2] := "x";
+		if (v_arr[v_index2] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index2] := "c";
+
+	}
+
+
+//###########################################################################//
+// Array of charstring indexed with special indexing array
+
+	type integer MyInt;
+
+	testcase tc_array_indexed_with_spec_array() runs on GeneralComp {
+		var charstring v_arr[2..4][2..4] := {{"a", "b", "c"}, {"d", "e", "f"}, {"g", "h", "i"}};
+		var MyInt v_index[1..1] := {3};
+
+////////////////////////////////////////////////////
+
+		if (v_arr[v_index] == {"d", "e", "f"}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index] := {"x", "y", "z"};
+		if (v_arr[v_index] == {"x", "y", "z"}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index] := {"d", "e", "f"};
+
+////////////////////////////////////////////////////
+
+		if (v_arr[v_index][2] == "d") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][2] := "x";
+		if (v_arr[v_index][2] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][2] := "d";
+
+////////////////////////////////////////////////////
+
+		if (v_arr[2][v_index] == "b") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[2][v_index] := "x";
+		if (v_arr[2][v_index] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[2][v_index] := "b";
+
+////////////////////////////////////////////////////
+
+		if (v_arr[v_index][v_index] == "e") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index][v_index] := "x";
+		if (v_arr[v_index][v_index] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index][v_index] := "e";
+
+////////////////////////////////////////////////////
+
+        var MyInt v_index2[3..4] := {3, 2};
+        if (v_arr[v_index2] == "d") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		// Assignment test
+		v_arr[v_index2] := "x";
+		if (v_arr[v_index2] == "x") {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+		// Restore to original value
+		v_arr[v_index2] := "d";
+	}
+
+	control {
+		execute(tc_recordof_indexed_with_array());
+		execute(tc_recordof_indexed_with_recordof());
+		execute(tc_recordof_indexed_with_recordof_and_array());
+
+		execute(tc_setof_indexed_with_array());
+		execute(tc_setof_indexed_with_recordof());
+		execute(tc_setof_indexed_with_recordof_and_array());
+		
+		execute(tc_array_indexed_with_array());
+		execute(tc_array_indexed_with_recordof());
+		execute(tc_array_indexed_with_recordof_and_array());
+
+		execute(tc_arrayfstr_indexed_with_recordof());
+		execute(tc_array_indexed_with_spec_array());
+	}
+
+}
diff --git a/regression_test/indexWithRecofArray/Makefile b/regression_test/indexWithRecofArray/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..afb9b4e0e6c0bc0bcfba35d3a8c855133175fee1
--- /dev/null
+++ b/regression_test/indexWithRecofArray/Makefile
@@ -0,0 +1,56 @@
+##############################################################################
+# Copyright (c) 2000-2016 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#   Szabo, Bence Janos
+#
+##############################################################################
+TOPDIR := ..
+include $(TOPDIR)/Makefile.regression
+
+.SUFFIXES: .ttcn .hh
+.PHONY: all clean dep run
+
+TTCN3_LIB = ttcn3$(RT2_SUFFIX)$(DYNAMIC_SUFFIX)
+
+TTCN3_MODULES = IndexWithRecofArray.ttcn
+
+GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc)
+GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh)
+ifdef CODE_SPLIT
+GENERATED_SOURCES := $(foreach file, $(GENERATED_SOURCES:.cc=), $(addprefix $(file), .cc _seq.cc _set.cc  _seqof.cc _setof.cc _union.cc))
+else ifdef SPLIT_TO_SLICES
+POSTFIXES := $(foreach file, $(SPLIT_TO_SLICES), $(addsuffix $(file), _part_))
+POSTFIXES := $(foreach file, $(POSTFIXES), $(addprefix $(file), .cc))
+GENERATED_SOURCES2 := $(foreach file, $(GENERATED_SOURCES:.cc=), $(addprefix $(file), $(POSTFIXES)))
+GENERATED_SOURCES += $(GENERATED_SOURCES2)
+endif
+
+OBJECTS = $(GENERATED_SOURCES:.cc=.o)
+
+TARGET = IndexWithRecofArray$(EXESUFFIX)
+
+all: $(TARGET)
+
+$(TARGET): $(GENERATED_SOURCES) $(USER_SOURCES)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS)
+
+.ttcn.cc .ttcn.hh:
+	$(TTCN3_COMPILER) $<
+
+clean distclean:
+	-rm -f $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \
+	$(GENERATED_SOURCES) *.log Makefile.bak
+
+dep: $(GENERATED_SOURCES)
+	makedepend $(CPPFLAGS) $(GENERATED_SOURCES)
+
+run: $(TARGET)
+	./$^
+
+.NOTPARALLEL:
+