diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c
index 28cf14afc282707d0759570bf5157b9cd7eab455..d5ba2293684bc49d1a10104dd71c2eb34a3f1238 100644
--- a/src/modules/files/efuns.c
+++ b/src/modules/files/efuns.c
@@ -252,12 +252,11 @@ void f_exece(INT32 args)
     if(sp[2-args].type != T_MAPPING)
       error("Bad argument 3 to exece().\n");
     en=sp[2-args].u.mapping;
-    array_fix_type_field(en->ind);
-    array_fix_type_field(en->val);
+    mapping_fix_type_field(en);
 
-    if(en->ind->type_field & ~BIT_STRING)
+    if(m_ind_types(en) & ~BIT_STRING)
       error("Bad argument 3 to exece().\n");
-    if(en->val->type_field & ~BIT_STRING)
+    if(m_val_types(en) & ~BIT_STRING)
       error("Bad argument 3 to exece().\n");
 
   case 2:
@@ -287,24 +286,26 @@ void f_exece(INT32 args)
 
   if(en)
   {
-    env=(char **)xalloc((1+en->ind->size) * sizeof(char *));
+    INT32 e;
+    struct array *i,*v;
 
-    for(e=0;e<en->ind->size;e++)
-    {
-      union anything *a;
-      a=low_array_get_item_ptr(en->ind,e,T_STRING);
-      push_string(a->string);
-      a->string->refs++;
+    env=(char **)xalloc((1+m_sizeof(en)) * sizeof(char *));
 
+    i=mapping_indices(en);
+    v=mapping_values(en);
+    
+    for(e=0;e<i->size;e++)
+    {
+      push_string(ITEM(i)[e].u.string);
       push_string(make_shared_string("="));
-      a=low_array_get_item_ptr(en->val,e,T_STRING);
-      push_string(a->string);
-      a->string->refs++;
-
+      push_string(ITEM(v)[e].u.string);
       f_add(3);
-
       env[e]=sp[-1].u.string->str;
+      sp--;
     }
+      
+    free_array(i);
+    free_array(v);
     env[e]=0;
   }else{
     env=environ;