diff --git a/compiler2/Value.cc b/compiler2/Value.cc
index ead10d58b41a332f0f689bf6303ba5967f375da4..f3f1c912ea4ed2506c9e65ec49f575bd7c154d24 100644
--- a/compiler2/Value.cc
+++ b/compiler2/Value.cc
@@ -9103,12 +9103,26 @@ error:
                                      ReferenceChain *refch, bool silent)
   {
     Value *v_index = array_index->get_value_refd_last(refch);
+    if (!my_governor) FATAL_ERROR("Value::get_refd_field_value()");
+    Type *t = my_governor->get_type_refd_last();
     Int index = 0;
     bool index_available = false;
     if (!v_index->is_unfoldable()) {
       if (v_index->valuetype == V_INT) {
         index = v_index->get_val_Int()->get_val();
         index_available = true;
+      } else if (v_index->valuetype == V_ARRAY || v_index->valuetype == V_SEQOF) {
+        Value *v = this;
+        size_t comps = v_index->get_nof_comps();
+        for (size_t i = 0; i < comps; i++) {
+          Value *comp = v_index->get_comp_byIndex(i);
+          v = v->get_refd_array_value(comp, usedInIsbound, refch, silent);
+          if (v == NULL) {
+            // error reported already
+            return 0;
+          }
+        }
+        return v;
       } else if (!silent) {
         array_index->error("An integer value or a fixed length array or record of integer value was expected as index");
       }
@@ -9120,8 +9134,7 @@ error:
       }
       return 0;
     }
-    if (!my_governor) FATAL_ERROR("Value::get_refd_field_value()");
-    Type *t = my_governor->get_type_refd_last();
+
     switch (t->get_typetype()) {
     case Type::T_ERROR:
       // remain silent
diff --git a/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn b/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn
index 42fc6cfcea51c325a54831f9b25923eb1681e5b3..349116aa69ea3661cdec566ff4183bceba67b70e 100644
--- a/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn
+++ b/function_test/Semantic_Analyser/recof_index/recof_index_SE.ttcn
@@ -11,10 +11,13 @@
  ******************************************************************************/
 module recof_index_SE { //^In TTCN-3 module//
 
+  type set of set of integer SoSoI;
   type record of record of integer RoRoI;
+  type record length(1) of integer RoIOne;
   type record length(1..2) of integer RoI1;
   type record length(3) of integer RoI2;
   type record of integer RoI;
+  type set of integer SoI;
 
   type record length(1) of float RoF1;
 
@@ -47,4 +50,41 @@ module recof_index_SE { //^In TTCN-3 module//
   }
 
 
+  const RoRoI c_roiroi1 := {{1,2}, {3,4}}
+  
+  const RoIOne c_roi := {3}; //error\: Index overflow in a value of \`record of\' type \`\@recof_index_SE\.RoRoI\'\: the index is 3\, but the value has only 2 elements//
+  const RoI c_roi_err := c_roiroi1[c_roi]; //^In constant definition \`c_roi_err\'\:// 
+  
+  const RoIOne c_roi2 := {4}; //error\: Index overflow in a value of \`record of\' type \`\@recof_index_SE\.RoRoI\.SEQUENCE_OF\'\: the index is 4\, but the value has only 2 elements//
+  const integer c_int_err := c_roiroi1[1][c_roi2]; //^In constant definition \`c_int_err\'\:// 
+  
+  const RoI2 c_roi3 := {1,1,1}; //error\: Invalid array element reference\: type \`integer\' cannot be indexed//
+  const integer c_int_err2 := c_roiroi1[c_roi3]; //In constant definition \`c_int_err2\'\://
+
+
+  const SoSoI c_soisoi1 := {{1,2}, {3,4}}
+  
+  const RoIOne c_roi4 := {3}; //error\: Index overflow in a value of \`set of\' type \`\@recof_index_SE\.SoSoI\'\: the index is 3\, but the value has only 2 elements//
+  const SoI c_soi_err := c_soisoi1[c_roi4]; //^In constant definition \`c_soi_err\'\:// 
+  
+  const RoIOne c_roi5 := {4}; //error\: Index overflow in a value of \`set of\' type \`\@recof_index_SE\.SoSoI\.SET_OF\'\: the index is 4\, but the value has only 2 elements//
+  const integer c_int_err3 := c_soisoi1[1][c_roi5]; //^In constant definition \`c_int_err3\'\:// 
+  
+  const RoI2 c_roi6 := {1,1,1}; //error\: Invalid array element reference\: type \`integer\' cannot be indexed//
+  const integer c_int_err4 := c_soisoi1[c_roi6]; //In constant definition \`c_int_err4\'\://
+
+
+  const integer c_arrarr1[2][2] := {{1,2}, {3,4}}
+  
+  const RoIOne c_roi7 := {3}; //error\: Array index overflow\: the index value must be at most \`1\' instead of \`3\'//
+  const integer c_arr_err[2] := c_arrarr1[c_roi7]; //^In constant definition \`c_arr_err\'\:// 
+  
+  const RoIOne c_roi8 := {4}; //error\: Array index overflow\: the index value must be at most \`1\' instead of \`4\'//
+  const integer c_int_err5 := c_arrarr1[1][c_roi8]; //^In constant definition \`c_int_err5\'\:// 
+  
+  const RoI2 c_roi9 := {1,1,1}; //error\: Invalid array element reference\: type \`integer\' cannot be indexed//
+  const integer c_int_err6 := c_arrarr1[c_roi9]; //In constant definition \`c_int_err6\'\://
+
+  
+
 }
diff --git a/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn b/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn
index c759c8b8c2fc226f48702b26dc57a01f4e1763bb..de629004ed8670513ac77afccb6c3e159f1737c4 100644
--- a/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn
+++ b/regression_test/indexWithRecofArray/IndexWithRecofArray.ttcn
@@ -16,12 +16,16 @@ module IndexWithRecofArray {
 	}
  
 
+	type record of integer RoI;
+	type set of integer SoI;
 	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;
+	type integer IntArr1[1];
+	type integer IntArr2[2];
 
 
 //###########################################################################//
@@ -1668,6 +1672,268 @@ module IndexWithRecofArray {
 		v_arr[v_index2] := "d";
 	}
 
+
+//###########################################################################//
+// Constants indexing
+
+	const RoRoI c_rois := {{1,2,3}, {4,5,6}};
+
+	const RoI1 c_roi1_1 := {0};
+	const RoI1 c_roi1_2 := {1};
+
+	const RoI2 c_roi2_1 := {0, 2};
+	const RoI2 c_roi2_2 := {1, 2}
+
+	const RoI c_roi_1 := c_rois[c_roi1_1]; // {1,2,3}
+	const RoI c_roi_2 := c_rois[c_roi1_2]; // {4,5,6}
+
+	const IntArr1 c_intarr_1 := {0};
+	const IntArr1 c_intarr_2 := {1};
+
+	const integer c_int_1 := c_rois[c_roi2_1]; // 3
+	const integer c_int_2 := c_rois[c_roi2_2]; // 6
+	const integer c_int_3 := c_rois[c_roi1_1][c_roi1_1]; // 1
+	const integer c_int_4 := c_rois[c_roi1_1][2]; // 3
+	const integer c_int_5 := c_rois[1][c_roi1_1]; // 4
+
+	const integer c_int_6 := c_rois[c_intarr_1][c_intarr_1]; // 1
+	const integer c_int_7 := c_rois[c_intarr_1][c_roi1_1]; // 1
+	const integer c_int_8 := c_rois[c_intarr_1][1]; // 2
+
+
+	testcase tc_const_record_of_indexing() runs on GeneralComp {
+		if (c_roi_1 == {1,2,3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_roi_2 == {4,5,6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_1 == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_2 == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_3 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_4 == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_5 == 4) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_6 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_7 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_8 == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+	}
+
+
+	const SoISoI c_sois := {{1,2,3}, {4,5,6}};
+	const SoI c_soi_1 := c_sois[c_roi1_1]; // {1,2,3}
+	const SoI c_soi_2 := c_sois[c_roi1_2]; // {4,5,6}
+
+	const integer c_int_9 := c_sois[c_roi2_1]; // 3
+	const integer c_int_10 := c_sois[c_roi2_2]; // 6
+	const integer c_int_11 := c_sois[c_roi1_1][c_roi1_1]; // 1
+	const integer c_int_12 := c_sois[c_roi1_1][2]; // 3
+	const integer c_int_13 := c_sois[1][c_roi1_1]; // 4
+
+	const integer c_int_14 := c_sois[c_intarr_1][c_intarr_1]; // 1
+	const integer c_int_15 := c_sois[c_intarr_1][c_roi1_1]; // 1
+	const integer c_int_16 := c_sois[c_intarr_1][1]; // 2
+
+
+	testcase tc_const_set_of_indexing() runs on GeneralComp {
+		if (c_soi_1 == {1,2,3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_soi_2 == {4,5,6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_9 == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_10 == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_11 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_12 == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_13 == 4) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_14 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_15 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_16 == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+	}
+
+	const integer c_arrarr[2][3] := {{1,2,3}, {4,5,6}}
+
+	const integer c_arr_0[3] := c_arrarr[c_roi1_1]; // {1,2,3}
+	const integer c_arr_1[3] := c_arr_0;
+	const integer c_arr_2[3] := c_arrarr[c_roi1_2]; // {4,5,6}
+
+	const integer c_int_17 := c_arrarr[c_roi2_1]; // 3
+	const integer c_int_18 := c_arrarr[c_roi2_2]; // 6
+	const integer c_int_19 := c_arrarr[c_roi1_1][c_roi1_1]; // 1
+	const integer c_int_20 := c_arrarr[c_roi1_1][2]; // 3
+	const integer c_int_21 := c_arrarr[1][c_roi1_1]; // 4
+
+	const integer c_int_22 := c_arrarr[c_intarr_1][c_intarr_1]; // 1
+	const integer c_int_23 := c_arrarr[c_intarr_1][c_roi1_1]; // 1
+	const integer c_int_24 := c_arrarr[c_intarr_1][1]; // 2
+
+
+	const integer c_arrarr_1[2..3][4..6] := {{1,2,3}, {4,5,6}}
+	const RoI1 c_roi1_3 := {3};
+	const RoI1 c_roi1_4 := {5};
+
+	const integer c_int_25 := c_arrarr_1[c_roi1_3][c_roi1_4]; // 5
+
+
+	testcase tc_const_array_indexing() runs on GeneralComp {
+		if (c_arr_1 == {1,2,3}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_arr_2 == {4,5,6}) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_17 == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_18 == 6) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_19 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_20 == 3) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_21 == 4) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_22 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_23 == 1) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_24 == 2) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+
+		if (c_int_25 == 5) {
+			setverdict(pass);
+		} else {
+			setverdict(fail);
+		}
+	}
+
+
 	control {
 		execute(tc_recordof_indexed_with_array());
 		execute(tc_recordof_indexed_with_recordof());
@@ -1683,6 +1949,10 @@ module IndexWithRecofArray {
 
 		execute(tc_arrayfstr_indexed_with_recordof());
 		execute(tc_array_indexed_with_spec_array());
+
+		execute(tc_const_record_of_indexing());
+		execute(tc_const_set_of_indexing());
+		execute(tc_const_array_indexing());
 	}
 
 }