diff --git a/compiler/2014/C_CodeGen.jrag b/compiler/2014/C_CodeGen.jrag
index 0beef112317f962d718b4a7c16b48f9afb3f5021..b7aae053368fb4659ec23e4d363b7bdf52c083d9 100644
--- a/compiler/2014/C_CodeGen.jrag
+++ b/compiler/2014/C_CodeGen.jrag
@@ -1453,7 +1453,8 @@ aspect C_Constructor {
 }
 
 aspect C_Sizeof {
- public void Decl.C_emitSizeofDeclaration(C_env env) {
+
+  public void Decl.C_emitSizeofDeclaration(C_env env) {
   }
 
   public void SampleDecl.C_emitSizeofDeclaration(C_env env) {
@@ -1578,10 +1579,10 @@ aspect C_Sizeof {
     int fixed = 0;
     for (int i = 0 ; i < getNumField() ; i++) {
       if (getField(i).getType().C_isDynamic()) {
-    getField(i).getType().C_emitSizeof(
-      env.nestStruct("." + getField(i).getName()));
+        getField(i).getType().C_emitSizeof(
+        env.nestStruct("." + getField(i).getName()));
       } else {
-    fixed += getField(i).getType().C_fixedSizeof();
+        fixed += getField(i).getType().C_fixedSizeof();
       }
     }
     if (fixed > 0) {
@@ -1589,36 +1590,43 @@ aspect C_Sizeof {
     }
   }
 
+  public void Exp.C_emitSizeof(C_env env, int i) {
+  }
+
+  public void VariableSize.C_emitSizeof(C_env env, int i) {
+    env.println("result += labcomm"+env.verStr+"_size_packed32(" + 
+                env.qualid + env.memberAccessor() + "n_" + i + ");");
+  }
+
   public void ArrayType.C_emitSizeof(C_env env) {
+    for (int i = 0 ; i < getNumExp() ; i++) {
+      getExp(i).C_emitSizeof(env, i);
+    }
     if (getType().C_isDynamic()) {
       env.println("{");
       env.indent();
       C_emitLoopVariables(env);
       for (int i = 0 ; i < getNumExp() ; i++) {
-    String iterator = "i_" + env.depth + "_" + i;
-    env.println("for (" + iterator + " = 0" +
-            " ; " +
-            iterator + " < " + getExp(i).C_getLimit(env, i) +
-            " ; " +
-            iterator + "++) {");
-    env.indent();
+        String iterator = "i_" + env.depth + "_" + i;
+        env.println("for (" + iterator + " = 0" +
+                    " ; " +
+                    iterator + " < " + getExp(i).C_getLimit(env, i) +
+                    " ; " +
+                    iterator + "++) {");
+        env.indent();
       }
       C_emitCalcIndex(env);
       getType().C_emitSizeof(C_Nest(env));
       for (int i = 0 ; i < getNumExp() ; i++) {
-    env.unindent();
-    env.println("}");
+        env.unindent();
+        env.println("}");
       }
       env.unindent();
       env.println("}");
     } else {
-      for (int i = 0 ; i < getNumExp() ; i++) {
-        env.println("result += labcomm"+env.verStr+"_size_packed32(" + 
-                getExp(i).C_getLimit(env, i) + ");");
-      }
       env.print("result += " + getType().C_fixedSizeof());
       for (int i = 0 ; i < getNumExp() ; i++) {
-    env.print(" * " + getExp(i).C_getLimit(env, i));
+        env.print(" * " + getExp(i).C_getLimit(env, i));
       }
       env.println(";");      
     }
diff --git a/lib/c/2014/Makefile b/lib/c/2014/Makefile
index 8e07aa737a1026de12779ba402dae43e716133a8..6742429773437384c38c06148fc6af2bd9f78dc5 100644
--- a/lib/c/2014/Makefile
+++ b/lib/c/2014/Makefile
@@ -108,6 +108,8 @@ $(TEST_DIR)/gen/%: $(TEST_DIR)/gen/%.o | $(TEST_DIR)/gen
 $(TEST_DIR)/gen/%.o: $(TEST_DIR)/%.c | $(TEST_DIR)/gen
 	$(CC) $(CFLAGS_TEST) -o $@ -c $<
 
+.PRECIOUS: $(TEST_DIR)/gen/%.c
+.PRECIOUS: $(TEST_DIR)/gen/%.h
 $(TEST_DIR)/gen/%.c $(TEST_DIR)/gen/%.h: $(TEST_DIR)/%.lc | $(TEST_DIR)/gen
 	$(LABCOMM) \
 		--c=$(TEST_DIR)/gen/$*.c \
diff --git a/lib/c/2014/test/test_labcomm.c b/lib/c/2014/test/test_labcomm.c
index 0e6090983d30ba8466f2c01d5cf522b5bb5c4a49..e37950e612d3ffb38c08bdec4b31c0325cb851a7 100644
--- a/lib/c/2014/test/test_labcomm.c
+++ b/lib/c/2014/test/test_labcomm.c
@@ -103,13 +103,13 @@ static struct labcomm_reader reader =  {
 static int32_t encoder_data[256];
 static test_sample_test_var encoder_var = {
   .n_0 = 1,
-  .n_1 = 1,
+  .n_2 = 1,
   .a = encoder_data,
 };
 static int32_t decoder_data[256];
 static test_sample_test_var decoder_var = {
   .n_0 = 1,
-  .n_1 = 1,
+  .n_2 = 1,
   .a = decoder_data,
 };;
 
@@ -146,27 +146,27 @@ int test_decode_one(struct labcomm_decoder *decoder)
 
 static void test_encode_decode(struct labcomm_encoder *encoder,
 			       struct labcomm_decoder *decoder,
-			       int expected, uint32_t n_0, uint32_t n_1)
+			       int expected, uint32_t n_0, uint32_t n_2)
 {
   int err;
 
   writer.pos = 0;
   encoder_var.n_0 = n_0;
-  encoder_var.n_1 = n_1;
+  encoder_var.n_2 = n_2;
   encoder_var.a[0] = 314;
   labcomm_encode_test_sample_test_var(encoder, &encoder_var);
   err = test_decode_one(decoder);
-  fprintf(stderr, "decode of sample %u * %u -> size=%d err=%d\n", 
-	  n_0, n_1, writer.pos, err);
+  fprintf(stderr, "decode of sample %u * 2 * %u -> size=%d err=%d\n", 
+	  n_0, n_2, writer.pos, err);
   if (writer.pos != labcomm_sizeof_test_sample_test_var(&encoder_var)) {
-    fprintf(stderr, "Incorrect sizeof %u * %u (%d != %d)\n",
-	    n_0, n_1, 
+    fprintf(stderr, "Incorrect sizeof %u * 2 * %u (%d != %d)\n",
+	    n_0, n_2, 
 	    writer.pos, labcomm_sizeof_test_sample_test_var(&encoder_var));
     exit(1);
   }
   if (writer.pos != expected) {
-    fprintf(stderr, "Unexpected size %u * %u (%d != %d)\n",
-	    n_0, n_1, 
+    fprintf(stderr, "Unexpected size %u * 2 * %u (%d != %d)\n",
+	    n_0, n_2, 
 	    writer.pos, expected);
     exit(1);
   }
@@ -194,13 +194,13 @@ int main(void)
   labcomm_encoder_register_test_sample_test_var(encoder);
   err = test_decode_one(decoder);
   fprintf(stderr, "decode of register -> index %d\n", err);
-  test_encode_decode(encoder, decoder, 8, 1, 1);
+  test_encode_decode(encoder, decoder, 12, 1, 1);
   if (decoder_var.a[0] != encoder_var.a[0]) {
     fprintf(stderr, "Failed to decode correct value %d != %d\n", 
 	    encoder_var.a[0], decoder_var.a[0]);
     exit(1);
   }
-  test_encode_decode(encoder, decoder, 20, 2, 2);
+  test_encode_decode(encoder, decoder, 36, 2, 2);
   test_encode_decode(encoder, decoder, 4, 0, 0);
   for (i = 1 ; i <= 4 ; i++) {
     test_encode_decode(encoder, decoder, 3+i, 0, (1<<(7*i))-1);
diff --git a/lib/c/2014/test/test_labcomm_copy.c b/lib/c/2014/test/test_labcomm_copy.c
index 8b6e5825d05dd094c2d894bb8040df7548cb9b24..728195582a491be649adcb05c4aaa3c930456f69 100644
--- a/lib/c/2014/test/test_labcomm_copy.c
+++ b/lib/c/2014/test/test_labcomm_copy.c
@@ -130,11 +130,13 @@ int main(int argc, char **argv)
 
   labcomm_encoder_register_test_sample_test_var(encoder);
   test_var.n_0 = 2;
-  test_var.n_1 = 7;
-  test_var.a = calloc(test_var.n_0 * test_var.n_1, sizeof(*test_var.a));
+  test_var.n_2 = 7;
+  test_var.a = calloc(test_var.n_0 * 2 * test_var.n_2, sizeof(*test_var.a));
   for (int i = 0; i < test_var.n_0; i++)
-    for (int j = 0; j < test_var.n_1; j++)
-      test_var.a[i] = 10 * i + j;
+    for (int j = 0; j < 2; j++)
+      for (int k = 0; k < test_var.n_2; k++) {
+        test_var.a[(((i) * 2 + j) * test_var.n_2) + k] = 100 * i + 10 * j + k;
+      }
   labcomm_encode_test_sample_test_var(encoder, &test_var);
 
   labcomm_encoder_register_more_types_A(encoder);
@@ -217,10 +219,15 @@ int main(int argc, char **argv)
   puts("P copied ok");
 
   assert(cache_test_var.n_0 == test_var.n_0);
-  assert(cache_test_var.n_1 == test_var.n_1);
+  assert(cache_test_var.n_2 == test_var.n_2);
   for (int i = 0; i < test_var.n_0; i++)
-    for (int j = 0; j < test_var.n_1; j++)
-      assert(cache_test_var.a[p.n_0 * i + j] == test_var.a[p.n_0 * i + j]);
+    for (int j = 0; j < 2; j++)
+      for (int k = 0; k < test_var.n_2; k++) {
+        assert(cache_test_var.a[(((i) * 2 + j) * test_var.n_2) + k] == 
+                     test_var.a[(((i) * 2 + j) * test_var.n_2) + k]);
+        assert(cache_test_var.a[(((i) * 2 + j) * test_var.n_2) + k] == 
+               100 * i + 10 * j + k);
+      }
   free(test_var.a);
   puts("test_var copied ok");
 
diff --git a/lib/c/2014/test/test_sample.lc b/lib/c/2014/test/test_sample.lc
index bac6bb64f8a8eea869bcb7b1360a0e1450633a1e..302c6158f2f6598995101898eec85bd9ae0f9835 100644
--- a/lib/c/2014/test/test_sample.lc
+++ b/lib/c/2014/test/test_sample.lc
@@ -1 +1 @@
-sample int test_var[_,_];
+sample int test_var[_,2,_];