Index: gap-4r7p3/src/pperm.c
===================================================================
--- gap-4r7p3.orig/src/pperm.c	2014-02-25 13:44:17.000000000 +0000
+++ gap-4r7p3/src/pperm.c	2014-02-25 13:44:59.000000000 +0000
@@ -2,7 +2,7 @@
 **
 ** A partial perm is of the form: 
 **
-** [codegree, entries of image list, domain, image set]
+** [image set, domain, codegree, entries of image list]
 **
 ** An element of the internal rep of a partial perm in T_PPERM2 must be at
 ** most 65535 and be of UInt2. The <codegree> is just the degree of the inverse
@@ -15,29 +15,26 @@
 #define MAX(a,b)          (a<b?b:a)
 #define MIN(a,b)          (a<b?a:b)
 
+#define IMG_PPERM(f)      (*(Obj*)(ADDR_OBJ(f)))
+#define DOM_PPERM(f)      (*((Obj*)(ADDR_OBJ(f))+1))
+
 #define NEW_PPERM2(deg)   NewBag(T_PPERM2, (deg+1)*sizeof(UInt2)+2*sizeof(Obj))
-#define CODEG_PPERM2(f)   (*((UInt2*)(ADDR_OBJ(f))))
-#define ADDR_PPERM2(f)    ((UInt2*)(ADDR_OBJ(f))+1)
-#define IMG_PPERM2(f)     (*(Obj*)(ADDR_PPERM2(f)+DEG_PPERM2(f)))
-#define DOM_PPERM2(f)     (*((Obj*)(ADDR_PPERM2(f)+DEG_PPERM2(f))+1))
-#define DEG_PPERM2(f)     ((UInt)(SIZE_OBJ(f)-sizeof(UInt2)-2*sizeof(Obj))/sizeof(UInt2))
-#define RANK_PPERM2(f)    (IMG_PPERM2(f)==NULL?INIT_PPERM2(f):LEN_PLIST(IMG_PPERM2(f)))
+#define CODEG_PPERM2(f)   (*(UInt2*)((Obj*)(ADDR_OBJ(f))+2))
+#define ADDR_PPERM2(f)    ((UInt2*)((Obj*)(ADDR_OBJ(f))+2)+1)
+#define DEG_PPERM2(f)  ((UInt)(SIZE_OBJ(f)-sizeof(UInt2)-2*sizeof(Obj))/sizeof(UInt2))
+#define RANK_PPERM2(f) (IMG_PPERM(f)==NULL?INIT_PPERM2(f):LEN_PLIST(IMG_PPERM(f)))
 
 #define NEW_PPERM4(deg)   NewBag(T_PPERM4, (deg+1)*sizeof(UInt4)+2*sizeof(Obj))
-#define CODEG_PPERM4(f)   (*((UInt4*)(ADDR_OBJ(f))))
-#define ADDR_PPERM4(f)    ((UInt4*)(ADDR_OBJ(f))+1)
-#define IMG_PPERM4(f)     (*((Obj*)(ADDR_PPERM4(f)+DEG_PPERM4(f))))
-#define DOM_PPERM4(f)     (*((Obj*)(ADDR_PPERM4(f)+DEG_PPERM4(f))+1))
+#define CODEG_PPERM4(f)   (*(UInt4*)((Obj*)(ADDR_OBJ(f))+2))
+#define ADDR_PPERM4(f)    ((UInt4*)((Obj*)(ADDR_OBJ(f))+2)+1)
 #define DEG_PPERM4(f)     ((UInt)(SIZE_OBJ(f)-sizeof(UInt4)-2*sizeof(Obj))/sizeof(UInt4))
-#define RANK_PPERM4(f)    (IMG_PPERM4(f)==NULL?INIT_PPERM4(f):LEN_PLIST(IMG_PPERM4(f)))
+#define RANK_PPERM4(f) (IMG_PPERM(f)==NULL?INIT_PPERM4(f):LEN_PLIST(IMG_PPERM(f)))
 
 #define IMAGEPP(i, ptf, deg) (i<=deg?ptf[i-1]:0)
 #define IS_PPERM(f)   (TNUM_OBJ(f)==T_PPERM2||TNUM_OBJ(f)==T_PPERM4)
 #define RANK_PPERM(f) (TNUM_OBJ(f)==T_PPERM2?RANK_PPERM2(f):RANK_PPERM4(f))
 #define DEG_PPERM(f)  (TNUM_OBJ(f)==T_PPERM2?DEG_PPERM2(f):DEG_PPERM4(f))
 #define CODEG_PPERM(f)(TNUM_OBJ(f)==T_PPERM2?CODEG_PPERM2(f):CODEG_PPERM4(f))
-#define IMG_PPERM(f)  (TNUM_OBJ(f)==T_PPERM2?IMG_PPERM2(f):IMG_PPERM4(f))
-#define DOM_PPERM(f)  (TNUM_OBJ(f)==T_PPERM2?DOM_PPERM2(f):DOM_PPERM4(f))
 
 Obj   EmptyPartialPerm;
 
@@ -77,8 +74,8 @@
   if(deg==0){
     dom=NEW_PLIST(T_PLIST_EMPTY, 0);
     SET_LEN_PLIST(dom, 0);
-    DOM_PPERM2(f)=dom;
-    IMG_PPERM2(f)=dom;
+    DOM_PPERM(f)=dom;
+    IMG_PPERM(f)=dom;
     CHANGED_BAG(f);
     return deg;
   }
@@ -108,8 +105,8 @@
   SHRINK_PLIST(dom, (Int) rank);
   SET_LEN_PLIST(dom, (Int) rank);
   
-  DOM_PPERM2(f)=dom;
-  IMG_PPERM2(f)=img;
+  DOM_PPERM(f)=dom;
+  IMG_PPERM(f)=img;
   CHANGED_BAG(f);
   return rank;
 }
@@ -124,8 +121,8 @@
   if(deg==0){
     dom=NEW_PLIST(T_PLIST_EMPTY, 0);
     SET_LEN_PLIST(dom, 0);
-    DOM_PPERM2(f)=dom;
-    IMG_PPERM2(f)=dom;
+    DOM_PPERM(f)=dom;
+    IMG_PPERM(f)=dom;
     CHANGED_BAG(f);
     return deg;
   }
@@ -154,8 +151,8 @@
   SHRINK_PLIST(dom, (Int) rank);
   SET_LEN_PLIST(dom, (Int) rank);
   
-  DOM_PPERM4(f)=dom;
-  IMG_PPERM4(f)=img;
+  DOM_PPERM(f)=dom;
+  IMG_PPERM(f)=img;
   CHANGED_BAG(f);
   return rank;
 }
@@ -292,8 +289,8 @@
     for(i=1;i<=rank;i++){ 
       ptf2[INT_INTOBJ(ELM_PLIST(dom, i))-1]=INT_INTOBJ(ELM_PLIST(img, i));
     }
-    DOM_PPERM2(f)=dom;
-    IMG_PPERM2(f)=img;
+    DOM_PPERM(f)=dom;
+    IMG_PPERM(f)=img;
     CODEG_PPERM2(f)=codeg;
   } else {
     f=NEW_PPERM4(deg);
@@ -303,8 +300,8 @@
       if(j>codeg) codeg=j;
       ptf4[INT_INTOBJ(ELM_PLIST(dom, i))-1]=j;
     }
-    DOM_PPERM4(f)=dom;
-    IMG_PPERM4(f)=img;
+    DOM_PPERM(f)=dom;
+    IMG_PPERM(f)=img;
     CODEG_PPERM4(f)=codeg;
   }
   CHANGED_BAG(f);
@@ -349,13 +346,14 @@
 
 /* domain of a partial perm */
 Obj FuncDOMAIN_PPERM(Obj self, Obj f){ 
-  if(TNUM_OBJ(f)==T_PPERM2){
-    if(DOM_PPERM2(f)==NULL) INIT_PPERM2(f);
-    return DOM_PPERM2(f);
-  } else {
-    if(DOM_PPERM4(f)==NULL) INIT_PPERM4(f);
-    return DOM_PPERM4(f);
+  if(DOM_PPERM(f)==NULL){
+    if(TNUM_OBJ(f)==T_PPERM2){
+      INIT_PPERM2(f);
+    } else {
+      INIT_PPERM4(f);
+    }
   }
+  return DOM_PPERM(f);
 } 
 
 /* image list of pperm */
@@ -365,11 +363,11 @@
   UInt      i, rank;
   Obj       out, dom;
   if(TNUM_OBJ(f)==T_PPERM2){
-    if(IMG_PPERM2(f)==NULL){
+    if(IMG_PPERM(f)==NULL){
       INIT_PPERM2(f);
-      return IMG_PPERM2(f);
-    } else if(!IS_SSORT_LIST(IMG_PPERM2(f))){
-      return IMG_PPERM2(f);
+      return IMG_PPERM(f);
+    } else if(!IS_SSORT_LIST(IMG_PPERM(f))){
+      return IMG_PPERM(f);
     }
     rank=RANK_PPERM2(f);
     if(rank==0){
@@ -380,16 +378,16 @@
     out=NEW_PLIST(T_PLIST_CYC_NSORT+IMMUTABLE, rank);
     SET_LEN_PLIST(out, rank);
     ptf2=ADDR_PPERM2(f);
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     for(i=1;i<=rank;i++){ 
       SET_ELM_PLIST(out,i,INTOBJ_INT(ptf2[INT_INTOBJ(ELM_PLIST(dom, i))-1]));
     }
   } else {
-    if(IMG_PPERM4(f)==NULL){
+    if(IMG_PPERM(f)==NULL){
       INIT_PPERM4(f);
-      return IMG_PPERM4(f);
-    } else if(!IS_SSORT_LIST(IMG_PPERM4(f))){
-      return IMG_PPERM4(f);
+      return IMG_PPERM(f);
+    } else if(!IS_SSORT_LIST(IMG_PPERM(f))){
+      return IMG_PPERM(f);
     }
     rank=RANK_PPERM4(f);
     if(rank==0){
@@ -400,7 +398,7 @@
     out=NEW_PLIST(T_PLIST_CYC_NSORT+IMMUTABLE, rank);
     SET_LEN_PLIST(out, rank);
     ptf4=ADDR_PPERM4(f);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
     for(i=1;i<=rank;i++){ 
       SET_ELM_PLIST(out,i,INTOBJ_INT(ptf4[INT_INTOBJ(ELM_PLIST(dom, i))-1]));
     }
@@ -411,21 +409,21 @@
 /* image set of partial perm */
 Obj FuncIMAGE_SET_PPERM (Obj self, Obj f){ 
   if(TNUM_OBJ(f)==T_PPERM2){
-    if(IMG_PPERM2(f)==NULL){
+    if(IMG_PPERM(f)==NULL){
       INIT_PPERM2(f);
-      return SORT_PLIST_CYC(IMG_PPERM2(f));
-    } else if(!IS_SSORT_LIST(IMG_PPERM2(f))){
-      return SORT_PLIST_CYC(IMG_PPERM2(f));
+      return SORT_PLIST_CYC(IMG_PPERM(f));
+    } else if(!IS_SSORT_LIST(IMG_PPERM(f))){
+      return SORT_PLIST_CYC(IMG_PPERM(f));
     }
-    return IMG_PPERM2(f);  
+    return IMG_PPERM(f);  
   } else if (TNUM_OBJ(f)==T_PPERM4){
-   if(IMG_PPERM4(f)==NULL){
+   if(IMG_PPERM(f)==NULL){
       INIT_PPERM4(f);
-      return SORT_PLIST_CYC(IMG_PPERM4(f));
-    } else if(!IS_SSORT_LIST(IMG_PPERM4(f))){
-      return SORT_PLIST_CYC(IMG_PPERM4(f));
+      return SORT_PLIST_CYC(IMG_PPERM(f));
+    } else if(!IS_SSORT_LIST(IMG_PPERM(f))){
+      return SORT_PLIST_CYC(IMG_PPERM(f));
     }
-    return IMG_PPERM4(f);
+    return IMG_PPERM(f);
   } else {
     ErrorQuit("usage: the argument must be a partial perm,", 0L, 0L);
   }
@@ -459,7 +457,7 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
     ptf2=ADDR_PPERM2(f);
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     
     //find chains
     for(i=1;i<=rank;i++){
@@ -493,7 +491,7 @@
   } else {
     deg=DEG_PPERM4(f);
     ptf4=ADDR_PPERM4(f);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
 
     //find chains
     for(i=1;i<=rank;i++){
@@ -568,7 +566,7 @@
   ptseen=(UInt4*)(ADDR_OBJ(TmpPPerm));
 
   if(TNUM_OBJ(f)==T_PPERM2){  
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     ptf2=ADDR_PPERM2(f);
     
     //find chains
@@ -591,7 +589,7 @@
       }
     }
   } else {
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
     ptf4=ADDR_PPERM4(f);      
 
     //find chains
@@ -643,7 +641,7 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
     ptf2=ADDR_PPERM2(f);
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
 
     //find chains
     for(i=1;i<=rank;i++){
@@ -667,7 +665,7 @@
   } else {
     deg=DEG_PPERM4(f);
     ptf4=ADDR_PPERM4(f);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
 
     //find chains
     for(i=1;i<=rank;i++){
@@ -714,7 +712,7 @@
   
   if(TNUM_OBJ(f)==T_PPERM2){  
     deg=DEG_PPERM2(f);
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     
     //find chains
     for(i=1;i<=rank;i++){
@@ -753,7 +751,7 @@
     }
   } else {
     deg=DEG_PPERM4(f);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
 
     //find chains
     for(i=1;i<=rank;i++){
@@ -849,7 +847,7 @@
   len=0;
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       out=NEW_PLIST(T_PLIST_CYC_SSORT, deg);
       ptf2=ADDR_PPERM2(f);
       for(i=0;i<deg;i++){
@@ -858,7 +856,7 @@
         }
       }
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       out=NEW_PLIST(T_PLIST_CYC_SSORT, rank);
       ptf2=ADDR_PPERM2(f);
@@ -871,7 +869,7 @@
     }
   } else {
     deg=DEG_PPERM4(f);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       out=NEW_PLIST(T_PLIST_CYC_SSORT, deg);
       ptf4=ADDR_PPERM4(f);
       for(i=0;i<deg;i++){
@@ -880,7 +878,7 @@
         }
       }
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f); 
       out=NEW_PLIST(T_PLIST_CYC_SSORT, rank);
       ptf4=ADDR_PPERM4(f);
@@ -910,10 +908,10 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
     ptf2=ADDR_PPERM2(f);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf2[i]==i+1) nr++;
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -923,10 +921,10 @@
   } else {
     deg=DEG_PPERM4(f);
     ptf4=ADDR_PPERM4(f);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf4[i]==i+1) nr++;
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -947,7 +945,7 @@
   len=0;
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       out=NEW_PLIST(T_PLIST_CYC_SSORT, deg);
       ptf2=ADDR_PPERM2(f);
       for(i=0;i<deg;i++){
@@ -956,7 +954,7 @@
         }
       }
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       out=NEW_PLIST(T_PLIST_CYC_SSORT, rank);
       ptf2=ADDR_PPERM2(f);
@@ -969,7 +967,7 @@
     }
   } else {
     deg=DEG_PPERM4(f);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       out=NEW_PLIST(T_PLIST_CYC_SSORT, deg);
       ptf4=ADDR_PPERM4(f);
       for(i=0;i<deg;i++){
@@ -978,7 +976,7 @@
         }
       }
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       out=NEW_PLIST(T_PLIST_CYC_SSORT, rank);
       ptf4=ADDR_PPERM4(f);
@@ -1006,10 +1004,10 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
     ptf2=ADDR_PPERM2(f);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf2[i]!=0&&ptf2[i]!=i+1) nr++;
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1019,10 +1017,10 @@
   } else {
     deg=DEG_PPERM4(f);
     ptf4=ADDR_PPERM4(f);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf4[i]!=0&&ptf4[i]!=i+1) nr++;
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1042,12 +1040,12 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
     ptf2=ADDR_PPERM2(f);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=deg;i>0;i--){
         if(ptf2[i-1]!=0&&ptf2[i-1]!=i) return INTOBJ_INT(i);
       }
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       for(i=RANK_PPERM2(f);i>=1;i--){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
         if(ptf2[j]!=j+1) return INTOBJ_INT(j+1);
@@ -1056,12 +1054,12 @@
   } else {
     deg=DEG_PPERM4(f);
     ptf4=ADDR_PPERM4(f);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=deg;i>0;i--){
         if(ptf4[i-1]!=0&&ptf4[i-1]!=i) return INTOBJ_INT(i);
       }
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       for(i=RANK_PPERM4(f);i>=1;i--){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
         if(ptf4[j]!=j+1) return INTOBJ_INT(j+1);
@@ -1080,12 +1078,12 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     deg=DEG_PPERM2(f);
     ptf2=ADDR_PPERM2(f);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++){
         if(ptf2[i]!=0&&ptf2[i]!=i+1) return INTOBJ_INT(i+1);
       }
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1095,12 +1093,12 @@
   } else {
     deg=DEG_PPERM4(f);
     ptf4=ADDR_PPERM4(f);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++){
         if(ptf4[i]!=0&&ptf4[i]!=i+1) return INTOBJ_INT(i+1);
       }
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1118,17 +1116,9 @@
 
   if(TNUM_OBJ(f)!=T_PPERM4||CODEG_PPERM4(f)>65535) return f;
 
-  ptf=((UInt4*)(ADDR_OBJ(f)));
+  ptf=ADDR_PPERM4(f)-1;
   deg=DEG_PPERM4(f);
   for(i=0;i<deg+1;i++) ((UInt2*)ptf)[i]=(UInt2)ptf[i]; 
-  
-  if((*((Obj*)(ptf+deg+1)+1))!=NULL){
-    (*((Obj*)((UInt2*)ptf+deg+1)  ))=(*((Obj*)(ptf+deg+1)  ));
-    (*((Obj*)((UInt2*)ptf+deg+1)+1))=(*((Obj*)(ptf+deg+1)+1)); //dom
-  } else {
-    (*((Obj*)((UInt2*)ptf+deg+1)  ))=NULL;
-    (*((Obj*)((UInt2*)ptf+deg+1)+1))=NULL;
-  }
 
   RetypeBag(f, T_PPERM2);
   ResizeBag(f, (deg+1)*sizeof(UInt2)+2*sizeof(Obj));
@@ -1144,13 +1134,13 @@
   
   if(TNUM_OBJ(f)==T_PPERM2){
     ptf2=ADDR_PPERM2(f);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       deg=DEG_PPERM2(f);
       for(i=0;i<deg;i++){
         if(ptf2[i]!=0&&ptf2[i]!=i+1) return False;
       }
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1159,13 +1149,13 @@
     }
   } else {
     ptf4=ADDR_PPERM4(f);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       deg=DEG_PPERM4(f);
       for(i=0;i<deg;i++){
         if(ptf4[i]!=0&&ptf4[i]!=i+1) return False;
       }
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1185,11 +1175,11 @@
 
   if(TNUM_OBJ(f)==T_PPERM2){
     rank=RANK_PPERM2(f);
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     deg=DEG_PPERM2(f);
   } else {
     rank=RANK_PPERM4(f);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
     deg=DEG_PPERM4(f);
   }
 
@@ -1201,8 +1191,8 @@
       ptg2[j]=j+1;
     }
     CODEG_PPERM2(g)=deg;
-    DOM_PPERM2(g)=dom;
-    IMG_PPERM2(g)=dom;
+    DOM_PPERM(g)=dom;
+    IMG_PPERM(g)=dom;
   } else {
     g=NEW_PPERM4(deg);
     ptg4=ADDR_PPERM4(g);
@@ -1211,8 +1201,8 @@
       ptg4[j]=j+1;
     }
     CODEG_PPERM4(g)=deg;
-    DOM_PPERM4(g)=dom;
-    IMG_PPERM4(g)=dom;
+    DOM_PPERM(g)=dom;
+    IMG_PPERM(g)=dom;
   }
   CHANGED_BAG(g);
   return g;
@@ -1228,11 +1218,11 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     codeg=CODEG_PPERM2(f);
     rank=RANK_PPERM2(f);
-    img=IMG_PPERM2(f);
+    img=IMG_PPERM(f);
   }else{
     codeg=CODEG_PPERM4(f);
     rank=RANK_PPERM4(f);
-    img=IMG_PPERM4(f);
+    img=IMG_PPERM(f);
   }
 
   if(codeg<65536){ 
@@ -1243,8 +1233,8 @@
       ptg2[j]=j+1;
     }
     if(IS_SSORT_LIST(img)){
-      DOM_PPERM2(g)=img;
-      IMG_PPERM2(g)=img;
+      DOM_PPERM(g)=img;
+      IMG_PPERM(g)=img;
     }
     CODEG_PPERM2(g)=codeg;
   } else {
@@ -1255,8 +1245,8 @@
       ptg4[j]=j+1;
     }
     if(IS_SSORT_LIST(img)){
-      DOM_PPERM4(g)=img;
-      IMG_PPERM4(g)=img;
+      DOM_PPERM(g)=img;
+      IMG_PPERM(g)=img;
     }
     CODEG_PPERM4(g)=codeg;
   }
@@ -1279,12 +1269,12 @@
     if(TNUM_OBJ(g)==T_PPERM2){
       deg=DEG_PPERM2(g);
       ptg2=ADDR_PPERM2(g);
-      if(DOM_PPERM2(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
         for(i=0;i<def;i++){
           if(ptf2[i]!=0&&ptf2[i]!=IMAGEPP(i+1, ptg2, deg)) return False;
         }
       } else {
-        dom=DOM_PPERM2(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM2(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i));
@@ -1294,12 +1284,12 @@
     } else if(TNUM_OBJ(g)==T_PPERM4){
       deg=DEG_PPERM4(g);
       ptg4=ADDR_PPERM4(g);
-      if(DOM_PPERM2(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
         for(i=0;i<def;i++){
           if(ptf2[i]!=0&&ptf2[i]!=IMAGEPP(i+1, ptg4, deg)) return False;
         }
       } else {
-        dom=DOM_PPERM2(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM2(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i));
@@ -1317,12 +1307,12 @@
     if(TNUM_OBJ(g)==T_PPERM2){
       deg=DEG_PPERM2(g);
       ptg2=ADDR_PPERM2(g);
-      if(DOM_PPERM4(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
         for(i=0;i<def;i++){
           if(ptf4[i]!=0&&ptf4[i]!=IMAGEPP(i+1, ptg2, deg)) return False;
         }
       } else {
-        dom=DOM_PPERM4(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM4(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i));
@@ -1332,12 +1322,12 @@
     } else if(TNUM_OBJ(g)==T_PPERM4){
       deg=DEG_PPERM4(g);
       ptg4=ADDR_PPERM4(g);
-      if(DOM_PPERM4(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
         for(i=0;i<def;i++){
           if(ptf4[i]!=0&&ptf4[i]!=IMAGEPP(i+1, ptg4, deg)) return False;
         }
       } else {
-        dom=DOM_PPERM4(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM4(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i));
@@ -1462,8 +1452,8 @@
     ptg4=ADDR_PPERM4(g);
     ptseen=(UInt4*)(ADDR_OBJ(TmpPPerm));
     
-    if(DOM_PPERM4(f)!=NULL){
-      dom=DOM_PPERM4(f);
+    if(DOM_PPERM(f)!=NULL){
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1472,8 +1462,8 @@
       }
     }
  
-    if(DOM_PPERM4(g)!=NULL){
-      dom=DOM_PPERM4(g);
+    if(DOM_PPERM(g)!=NULL){
+      dom=DOM_PPERM(g);
       rank=RANK_PPERM4(g);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1490,7 +1480,7 @@
       }
     }
 
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<degf;i++){
         if(ptf4[i]!=0){
           if(ptjoin4[i]==0){
@@ -1507,7 +1497,7 @@
       }
     }
     
-    if(DOM_PPERM4(g)==NULL){
+    if(DOM_PPERM(g)==NULL){
       for(i=0;i<degg;i++){
         if(ptg4[i]!=0){
           if(ptjoin4[i]==0){
@@ -1533,10 +1523,10 @@
     ptjoin4=ADDR_PPERM4(join);
     ptf4=ADDR_PPERM4(f);
     ptg2=ADDR_PPERM2(g);
-    ptseen=( UInt4*)(ADDR_OBJ(TmpPPerm));
+    ptseen=(UInt4*)(ADDR_OBJ(TmpPPerm));
 
-    if(DOM_PPERM4(f)!=NULL){
-      dom=DOM_PPERM4(f);
+    if(DOM_PPERM(f)!=NULL){
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1545,8 +1535,8 @@
       }
     }
  
-    if(DOM_PPERM2(g)!=NULL){
-      dom=DOM_PPERM2(g);
+    if(DOM_PPERM(g)!=NULL){
+      dom=DOM_PPERM(g);
       rank=RANK_PPERM2(g);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1563,7 +1553,7 @@
       }
     }
 
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<degf;i++){
         if(ptf4[i]!=0){
           if(ptjoin4[i]==0){
@@ -1580,7 +1570,7 @@
       }
     }
     
-    if(DOM_PPERM2(g)==NULL){
+    if(DOM_PPERM(g)==NULL){
       for(i=0;i<degg;i++){
         if(ptg2[i]!=0){
           if(ptjoin4[i]==0){
@@ -1608,10 +1598,10 @@
     ptjoin2=ADDR_PPERM2(join);
     ptf2=ADDR_PPERM2(f);
     ptg2=ADDR_PPERM2(g);
-    ptseen=( UInt4*)(ADDR_OBJ(TmpPPerm));
+    ptseen=(UInt4*)(ADDR_OBJ(TmpPPerm));
 
-    if(DOM_PPERM2(f)!=NULL){
-      dom=DOM_PPERM2(f);
+    if(DOM_PPERM(f)!=NULL){
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1620,8 +1610,8 @@
       }
     }
  
-    if(DOM_PPERM2(g)!=NULL){
-      dom=DOM_PPERM2(g);
+    if(DOM_PPERM(g)!=NULL){
+      dom=DOM_PPERM(g);
       rank=RANK_PPERM2(g);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -1638,7 +1628,7 @@
       }
     }
 
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<degf;i++){
         if(ptf2[i]!=0){
           if(ptjoin2[i]==0){
@@ -1655,7 +1645,7 @@
       }
     }
     
-    if(DOM_PPERM2(g)==NULL){
+    if(DOM_PPERM(g)==NULL){
       for(i=0;i<degg;i++){
         if(ptg2[i]!=0){
           if(ptjoin2[i]==0){
@@ -1944,12 +1934,12 @@
   Obj     p, dom;
 
   if(TNUM_OBJ(f)==T_PPERM2){
-    if(!EQ(FuncIMAGE_SET_PPERM(self, f), DOM_PPERM2(f))){
+    if(!EQ(FuncIMAGE_SET_PPERM(self, f), DOM_PPERM(f))){
       return Fail;
     }
     deg=DEG_PPERM2(f);
     p=NEW_PERM2(deg);
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     ptp2=ADDR_PERM2(p);
     ptf2=ADDR_PPERM2(f);
     for(i=0;i<deg;i++) ptp2[i]=i;
@@ -1959,12 +1949,12 @@
       ptp2[j]=ptf2[j]-1;
     }
   } else {
-   if(!EQ(FuncIMAGE_SET_PPERM(self, f), DOM_PPERM4(f))){
+   if(!EQ(FuncIMAGE_SET_PPERM(self, f), DOM_PPERM(f))){
      return Fail;
     }
     deg=DEG_PPERM4(f);
     p=NEW_PERM4(deg);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
     ptp4=ADDR_PERM4(p);
     ptf4=ADDR_PPERM4(f);
     for(i=0;i<deg;i++) ptp4[i]=i;
@@ -1991,7 +1981,7 @@
     ptp2=ADDR_PERM2(perm);
     for(i=0;i<deg;i++) ptp2[i]=i;
     rank=RANK_PPERM2(f);
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     //renew pointers since RANK_PPERM can trigger garbage collection
     ptp2=ADDR_PERM2(perm);
     ptf2=ADDR_PPERM2(f);
@@ -2014,7 +2004,7 @@
     ptp4=ADDR_PERM4(perm);
     for(i=0;i<deg;i++) ptp4[i]=i;
     rank=RANK_PPERM4(f);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
     //renew pointers since RANK_PPERM can trigger garbage collection
     ptp4=ADDR_PERM4(perm);
     ptf4=ADDR_PPERM4(f);
@@ -2048,21 +2038,21 @@
   if(TNUM_OBJ(f)==T_PPERM2){
     if(DEG_PPERM2(f)==0) return True;
     rankf=RANK_PPERM2(f);
-    domf=DOM_PPERM2(f);
+    domf=DOM_PPERM(f);
   } else {
     if(DEG_PPERM4(f)==0) return True;
     rankf=RANK_PPERM4(f);
-    domf=DOM_PPERM4(f);
+    domf=DOM_PPERM(f);
   }
 
   if(TNUM_OBJ(g)==T_PPERM2){
     if(DEG_PPERM2(g)==0) return False;
     rankg=RANK_PPERM2(g);
-    domg=DOM_PPERM2(g);
+    domg=DOM_PPERM(g);
   } else {
     if(DEG_PPERM4(g)==0) return False;
     rankg=RANK_PPERM4(g);
-    domg=DOM_PPERM2(f);
+    domg=DOM_PPERM(f);
   }
   
   if(rankf!=rankg) return (rankf<rankg?True:False);
@@ -2112,18 +2102,18 @@
 
 Obj FuncHAS_DOM_PPERM( Obj self, Obj f ){
   if(TNUM_OBJ(f)==T_PPERM2){
-    return (DOM_PPERM2(f)==NULL?False:True);
+    return (DOM_PPERM(f)==NULL?False:True);
   } else if (TNUM_OBJ(f)==T_PPERM4){
-    return (DOM_PPERM4(f)==NULL?False:True);
+    return (DOM_PPERM(f)==NULL?False:True);
   }
   return Fail;
 }
 
 Obj FuncHAS_IMG_PPERM( Obj self, Obj f ){
   if(TNUM_OBJ(f)==T_PPERM2){
-    return (IMG_PPERM2(f)==NULL?False:True);
+    return (IMG_PPERM(f)==NULL?False:True);
   } else if (TNUM_OBJ(f)==T_PPERM4){
-    return (IMG_PPERM4(f)==NULL?False:True);
+    return (IMG_PPERM(f)==NULL?False:True);
   }
   return Fail;
 }
@@ -2146,13 +2136,13 @@
   if(TNUM_OBJ(f)==T_PPERM2){//this could be shortened
     deg=MAX(DEG_PPERM2(f),CODEG_PPERM2(f));
     rank=RANK_PPERM2(f);
-    dom=DOM_PPERM2(f);
-    img=IMG_PPERM2(f);
+    dom=DOM_PPERM(f);
+    img=IMG_PPERM(f);
   }else{
     deg=MAX(DEG_PPERM4(f),CODEG_PPERM4(f));
     rank=RANK_PPERM4(f);
-    dom=DOM_PPERM4(f);
-    img=IMG_PPERM4(f);
+    dom=DOM_PPERM(f);
+    img=IMG_PPERM(f);
   }
 
   if(deg<65536){ 
@@ -2195,8 +2185,8 @@
   for(i=0;i<n;i++) ptseen[i]=0; 
   
   rank=RANK_PPERM2(f);//finds dom and img too
-  dom=DOM_PPERM2(f);
-  img=IMG_PPERM2(f);
+  dom=DOM_PPERM(f);
+  img=IMG_PPERM(f);
 
   ptf2=ADDR_PPERM2(f);
   ptseen=(UInt4*)(ADDR_OBJ(TmpPPerm));
@@ -2246,8 +2236,8 @@
   for(i=0;i<n;i++) ptseen[i]=0; 
   
   rank=RANK_PPERM4(f);//finds dom and img too
-  dom=DOM_PPERM4(f);
-  img=IMG_PPERM4(f);
+  dom=DOM_PPERM(f);
+  img=IMG_PPERM(f);
 
   ptseen=(UInt4*)(ADDR_OBJ(TmpPPerm));
   ptf4=ADDR_PPERM4(f);
@@ -2294,13 +2284,13 @@
 
   if(deg!=DEG_PPERM2(g)||CODEG_PPERM2(f)!=CODEG_PPERM2(g)) return 0L;
      
-  if(DOM_PPERM2(f)==NULL||DOM_PPERM2(g)==NULL){ 
+  if(DOM_PPERM(f)==NULL||DOM_PPERM(g)==NULL){ 
     for(i=0;i<deg;i++) if(*ptf++!=*ptg++) return 0L;
     return 1L;
   }
 
   if(RANK_PPERM2(f)!=RANK_PPERM2(g)) return 0L;
-  dom=DOM_PPERM2(f);
+  dom=DOM_PPERM(f);
   rank=RANK_PPERM2(f);
   
   for(i=1;i<=rank;i++){
@@ -2321,13 +2311,13 @@
 
   if(deg!=DEG_PPERM4(g)||CODEG_PPERM2(f)!=CODEG_PPERM4(g)) return 0L;
      
-  if(DOM_PPERM2(f)==NULL||DOM_PPERM4(g)==NULL){ 
+  if(DOM_PPERM(f)==NULL||DOM_PPERM(g)==NULL){ 
     for(i=0;i<deg;i++) if(*(ptf++)!=*(ptg++)) return 0L;
     return 1L;
   }
 
   if(RANK_PPERM2(f)!=RANK_PPERM4(g)) return 0L;
-  dom=DOM_PPERM2(f);
+  dom=DOM_PPERM(f);
   rank=RANK_PPERM2(f);
   
   for(i=1;i<=rank;i++){
@@ -2346,13 +2336,13 @@
 
   if(deg!=DEG_PPERM2(g)||CODEG_PPERM4(f)!=CODEG_PPERM2(g)) return 0L;
      
-  if(DOM_PPERM4(f)==NULL||DOM_PPERM2(g)==NULL){ 
+  if(DOM_PPERM(f)==NULL||DOM_PPERM(g)==NULL){ 
     for(i=0;i<deg;i++) if(*(ptf++)!=*(ptg++)) return 0L;
     return 1L;
   }
 
   if(RANK_PPERM4(f)!=RANK_PPERM2(g)) return 0L;
-  dom=DOM_PPERM4(f);
+  dom=DOM_PPERM(f);
   rank=RANK_PPERM4(f);
   
   for(i=1;i<=rank;i++){
@@ -2371,13 +2361,13 @@
 
   if(deg!=DEG_PPERM4(g)||CODEG_PPERM4(f)!=CODEG_PPERM4(g)) return 0L;
      
-  if(DOM_PPERM4(f)==NULL||DOM_PPERM4(g)==NULL){ 
+  if(DOM_PPERM(f)==NULL||DOM_PPERM(g)==NULL){ 
     for(i=0;i<deg;i++) if(*(ptf++)!=*(ptg++)) return 0L;
     return 1L;
   }
 
   if(RANK_PPERM4(f)!=RANK_PPERM4(g)) return 0L;
-  dom=DOM_PPERM4(f);
+  dom=DOM_PPERM(f);
   rank=RANK_PPERM4(f);
   
   for(i=1;i<=rank;i++){
@@ -2505,8 +2495,8 @@
   codeg=0;
  
   // compose in rank operations
-  if(DOM_PPERM2(f)!=NULL){
-    dom=DOM_PPERM2(f); 
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f); 
     rank=RANK_PPERM2(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2557,8 +2547,8 @@
   codeg=0;
  
   // compose in rank operations
-  if(DOM_PPERM4(f)!=NULL){
-    dom=DOM_PPERM4(f); 
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f); 
     rank=RANK_PPERM4(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2604,8 +2594,8 @@
   codeg=0;
  
   // compose in rank operations
-  if(DOM_PPERM4(f)!=NULL){
-    dom=DOM_PPERM4(f); 
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f); 
     rank=RANK_PPERM4(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2658,8 +2648,8 @@
   codeg=0;
  
   // compose in rank operations
-  if(DOM_PPERM2(f)!=NULL){
-    dom=DOM_PPERM2(f); 
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f); 
     rank=RANK_PPERM2(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2705,7 +2695,7 @@
     ptfp2=ADDR_PPERM2(fp);
     if(codeg<=dep){
       codeg=0;
-      if(DOM_PPERM2(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
         //Pr("Case 2\n", 0L, 0L);
         for(i=0;i<deg;i++){ 
           if(ptf[i]!=0){
@@ -2715,7 +2705,7 @@
         }
       } else {
         //Pr("Case 1\n", 0L, 0L);
-        dom=DOM_PPERM2(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM2(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2724,7 +2714,7 @@
         }
       }
     } else {
-      if(DOM_PPERM2(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
        //Pr("Case 4\n", 0L, 0L);
         for(i=0;i<deg;i++){
           if(ptf[i]!=0){
@@ -2733,7 +2723,7 @@
         }
       }else{
         //Pr("Case 3\n", 0L, 0L);
-        dom=DOM_PPERM2(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM2(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2745,7 +2735,7 @@
   } else {
     ptfp4=ADDR_PPERM4(fp);
     codeg=0;
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       //Pr("Case 6\n", 0L, 0L);
       for(i=0;i<deg;i++){
         if(ptf[i]!=0){
@@ -2755,7 +2745,7 @@
       }
     } else {
       //Pr("Case 5\n", 0L, 0L);
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2785,7 +2775,7 @@
   
   if(codeg<=dep){
     codeg=0;
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       //Pr("case 1\n", 0L, 0L);
       for(i=0;i<deg;i++){ 
         if(ptf[i]!=0){
@@ -2795,7 +2785,7 @@
       }
     } else {
       //Pr("case 2\n", 0L, 0L);
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2804,7 +2794,7 @@
       }
     }
   } else {
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       //Pr("case 3\n", 0L, 0L);
       for(i=0;i<deg;i++){
         if(ptf[i]!=0){
@@ -2813,7 +2803,7 @@
       }
     }else{
       //Pr("case 4\n", 0L, 0L);
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2837,7 +2827,7 @@
   ptfp=ADDR_PPERM4(fp);
   codeg=0;
   
-  if(DOM_PPERM2(f)==NULL){
+  if(DOM_PPERM(f)==NULL){
     deg=DEG_PPERM2(f);
     for(i=0;i<deg;i++){
       if(ptf[i]!=0){
@@ -2846,7 +2836,7 @@
       }
     }
   } else {
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     rank=RANK_PPERM2(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -2874,7 +2864,7 @@
   ptp=ADDR_PERM2(p);
   ptfp=ADDR_PPERM4(fp);
   
-  if(DOM_PPERM4(f)==NULL){
+  if(DOM_PPERM(f)==NULL){
     //Pr("case 1\n", 0L, 0L);
     for(i=0;i<deg;i++){
       if(ptf[i]!=0){
@@ -2883,7 +2873,7 @@
     }
   }else{
     //Pr("case 2\n", 0L, 0L);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
     rank=RANK_PPERM4(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -3047,10 +3037,10 @@
     inv=NEW_PPERM2(codeg);
     ptf=ADDR_PPERM2(f);
     ptinv2=ADDR_PPERM2(inv);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf[i]!=0) ptinv2[ptf[i]-1]=i+1;
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -3062,10 +3052,10 @@
     inv=NEW_PPERM4(codeg);
     ptf=ADDR_PPERM2(f);
     ptinv4=ADDR_PPERM4(inv);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf[i]!=0) ptinv4[ptf[i]-1]=i+1;
     } else {
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -3090,10 +3080,10 @@
     inv=NEW_PPERM2(codeg);
     ptf=ADDR_PPERM4(f);
     ptinv2=ADDR_PPERM2(inv);
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf[i]!=0) ptinv2[ptf[i]-1]=i+1;
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -3105,10 +3095,10 @@
     inv=NEW_PPERM4(codeg);
     ptf=ADDR_PPERM4(f);
     ptinv4=ADDR_PPERM4(inv);
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       for(i=0;i<deg;i++) if(ptf[i]!=0) ptinv4[ptf[i]-1]=i+1;
     } else {
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -3134,7 +3124,7 @@
   dep=DEG_PERM2(p); 
   rank=RANK_PPERM2(f);
   ptp=ADDR_PERM2(p);
-  dom=DOM_PPERM2(f); 
+  dom=DOM_PPERM(f); 
   
   //find deg of conjugate
   if(deg>dep){
@@ -3185,7 +3175,7 @@
   dep=DEG_PERM4(p); 
   rank=RANK_PPERM2(f);
   ptp=ADDR_PERM4(p);
-  dom=DOM_PPERM2(f); 
+  dom=DOM_PPERM(f); 
   //find deg of conjugate
   if(deg>dep){
     degconj=deg;
@@ -3226,7 +3216,7 @@
   dep=DEG_PERM2(p); 
   rank=RANK_PPERM4(f);
   ptp=ADDR_PERM2(p);
-  dom=DOM_PPERM4(f); 
+  dom=DOM_PPERM(f); 
   
   //find deg of conjugate
   if(deg>dep){
@@ -3275,7 +3265,7 @@
   dep=DEG_PERM4(p); 
   rank=RANK_PPERM4(f);
   ptp=ADDR_PERM4(p);
-  dom=DOM_PPERM4(f); 
+  dom=DOM_PPERM(f); 
   
   //find deg of conjugate
   if(deg>dep){
@@ -3329,7 +3319,7 @@
  
   ptf=ADDR_PPERM2(f);
   ptg=ADDR_PPERM2(g);
-  dom=DOM_PPERM2(f);
+  dom=DOM_PPERM(f);
   codeg=CODEG_PPERM2(g); 
   dec=0;
   codec=0;
@@ -3513,7 +3503,7 @@
  
   ptf=ADDR_PPERM2(f);
   ptg=ADDR_PPERM4(g);
-  dom=DOM_PPERM2(f);
+  dom=DOM_PPERM(f);
   codeg=CODEG_PPERM4(g); 
   dec=0;
   codec=0;
@@ -3697,7 +3687,7 @@
  
   ptf=ADDR_PPERM4(f);
   ptg=ADDR_PPERM2(g);
-  dom=DOM_PPERM4(f);
+  dom=DOM_PPERM(f);
   codeg=CODEG_PPERM2(g); 
   dec=0;
   codec=0;
@@ -3880,7 +3870,7 @@
  
   ptf=ADDR_PPERM4(f);
   ptg=ADDR_PPERM4(g);
-  dom=DOM_PPERM4(f);
+  dom=DOM_PPERM(f);
   codeg=CODEG_PPERM4(g); 
   dec=0;
   codec=0;
@@ -4084,7 +4074,7 @@
     ptquo2=ADDR_PPERM2(quo);
     if(codeg<=lmp){
       codeg=0;
-      if(DOM_PPERM2(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
         //Pr("Case 2\n", 0L, 0L);
         for(i=0;i<deg;i++){ 
           if(ptf[i]!=0){
@@ -4094,7 +4084,7 @@
         }
       } else {
         //Pr("Case 1\n", 0L, 0L);
-        dom=DOM_PPERM2(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM2(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4103,7 +4093,7 @@
         }
       }
     } else {
-      if(DOM_PPERM2(f)==NULL){
+      if(DOM_PPERM(f)==NULL){
        //Pr("Case 4\n", 0L, 0L);
         for(i=0;i<deg;i++){
           if(ptf[i]!=0){
@@ -4112,7 +4102,7 @@
         }
       }else{
         //Pr("Case 3\n", 0L, 0L);
-        dom=DOM_PPERM2(f);
+        dom=DOM_PPERM(f);
         rank=RANK_PPERM2(f);
         for(i=1;i<=rank;i++){
           j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4128,7 +4118,7 @@
     pttmp=((UInt4*)ADDR_OBJ(TmpPPerm));
     ptquo4=ADDR_PPERM4(quo);
     codeg=0;
-    if(DOM_PPERM2(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       //Pr("Case 6\n", 0L, 0L);
       for(i=0;i<deg;i++){
         if(ptf[i]!=0){
@@ -4138,7 +4128,7 @@
       }
     } else {
       //Pr("Case 5\n", 0L, 0L);
-      dom=DOM_PPERM2(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM2(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4183,7 +4173,7 @@
   //multiply the partial perm with the inverse
   if(codeg<=lmp){
     codeg=0;
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       //Pr("case 1\n", 0L, 0L);
       for(i=0;i<deg;i++){ 
         if(ptf[i]!=0){
@@ -4193,7 +4183,7 @@
       }
     } else {
       //Pr("case 2\n", 0L, 0L);
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4202,7 +4192,7 @@
       }
     }
   } else {
-    if(DOM_PPERM4(f)==NULL){
+    if(DOM_PPERM(f)==NULL){
       //Pr("case 3\n", 0L, 0L);
       for(i=0;i<deg;i++){
         if(ptf[i]!=0){
@@ -4211,7 +4201,7 @@
       }
     }else{
       //Pr("case 4\n", 0L, 0L);
-      dom=DOM_PPERM4(f);
+      dom=DOM_PPERM(f);
       rank=RANK_PPERM4(f);
       for(i=1;i<=rank;i++){
         j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4254,7 +4244,7 @@
   
   //multiply the partial perm with the inverse
   codeg=0;
-  if(DOM_PPERM2(f)==NULL){
+  if(DOM_PPERM(f)==NULL){
     for(i=0;i<deg;i++){
       if(ptf[i]!=0){
         ptquo[i]=pttmp[ptf[i]-1]+1;
@@ -4262,7 +4252,7 @@
       }
     }
   } else {
-    dom=DOM_PPERM2(f);
+    dom=DOM_PPERM(f);
     rank=RANK_PPERM2(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4304,7 +4294,7 @@
   ptquo=ADDR_PPERM4(quo);
   
   //multiply the partial perm with the inverse
-  if(DOM_PPERM4(f)==NULL){
+  if(DOM_PPERM(f)==NULL){
     //Pr("case 1\n", 0L, 0L);
     for(i=0;i<deg;i++){
       if(ptf[i]!=0){
@@ -4313,7 +4303,7 @@
     }
   }else{
     //Pr("case 2\n", 0L, 0L);
-    dom=DOM_PPERM4(f);
+    dom=DOM_PPERM(f);
     rank=RANK_PPERM4(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4342,11 +4332,11 @@
 
   //invert g into the buffer bag
   ptg=ADDR_PPERM2(g);
-  if(DOM_PPERM2(g)==NULL){
+  if(DOM_PPERM(g)==NULL){
     deg=DEG_PPERM2(g);
     for(i=0;i<deg;i++) if(ptg[i]!=0) pttmp[ptg[i]-1]=i+1; 
   } else {
-    dom=DOM_PPERM2(g);
+    dom=DOM_PPERM(g);
     rank=RANK_PPERM2(g);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4368,8 +4358,8 @@
   codeg=0;
  
   // compose f with g^-1 in rank operations
-  if(DOM_PPERM2(f)!=NULL){
-    dom=DOM_PPERM2(f);
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f);
     rank=RANK_PPERM2(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4408,11 +4398,11 @@
 
   //invert g into the buffer bag
   ptg=ADDR_PPERM4(g);
-  if(DOM_PPERM4(g)==NULL){
+  if(DOM_PPERM(g)==NULL){
     deg=DEG_PPERM4(g);
     for(i=0;i<deg;i++) if(ptg[i]!=0) pttmp[ptg[i]-1]=i+1; 
   } else {
-    dom=DOM_PPERM4(g);
+    dom=DOM_PPERM(g);
     rank=RANK_PPERM4(g);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4439,8 +4429,8 @@
   codeg=0;
 
   // compose f with g^-1 in rank operations
-  if(DOM_PPERM2(f)!=NULL){
-    dom=DOM_PPERM2(f); 
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f); 
     rank=RANK_PPERM2(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4479,11 +4469,11 @@
 
   //invert g into the buffer bag
   ptg=ADDR_PPERM2(g);
-  if(DOM_PPERM2(g)==NULL){
+  if(DOM_PPERM(g)==NULL){
     deg=DEG_PPERM2(g);
     for(i=0;i<deg;i++) if(ptg[i]!=0) pttmp[ptg[i]-1]=i+1; 
   } else {
-    dom=DOM_PPERM2(g);
+    dom=DOM_PPERM(g);
     rank=RANK_PPERM2(g);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4510,8 +4500,8 @@
   codeg=0;
 
   // compose f with g^-1 in rank operations
-  if(DOM_PPERM4(f)!=NULL){
-    dom=DOM_PPERM4(f); 
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f); 
     rank=RANK_PPERM4(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4549,11 +4539,11 @@
 
   //invert g into the buffer bag
   ptg=ADDR_PPERM4(g);
-  if(DOM_PPERM4(g)==NULL){
+  if(DOM_PPERM(g)==NULL){
     deg=DEG_PPERM4(g);
     for(i=0;i<deg;i++) if(ptg[i]!=0) pttmp[ptg[i]-1]=i+1; 
   } else {
-    dom=DOM_PPERM4(g);
+    dom=DOM_PPERM(g);
     rank=RANK_PPERM4(g);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4575,8 +4565,8 @@
   codeg=0;
  
   // compose f with g^-1 in rank operations
-  if(DOM_PPERM4(f)!=NULL){
-    dom=DOM_PPERM4(f);
+  if(DOM_PPERM(f)!=NULL){
+    dom=DOM_PPERM(f);
     rank=RANK_PPERM4(f);
     for(i=1;i<=rank;i++){
       j=INT_INTOBJ(ELM_PLIST(dom, i))-1;
@@ -4627,7 +4617,7 @@
   if(def==0) return EmptyPartialPerm;
   
   dep=DEG_PERM2(p);
-  dom=DOM_PPERM2(f);
+  dom=DOM_PPERM(f);
 
   if(dep<def){
     lquo=NEW_PPERM2(def);
@@ -4698,7 +4688,7 @@
   if(def==0) return EmptyPartialPerm;
   
   dep=DEG_PERM2(p);
-  dom=DOM_PPERM4(f);
+  dom=DOM_PPERM(f);
 
   if(dep<def){
     lquo=NEW_PPERM4(def);
@@ -4769,7 +4759,7 @@
   if(def==0) return EmptyPartialPerm;
   
   dep=DEG_PERM4(p);
-  dom=DOM_PPERM2(f);
+  dom=DOM_PPERM(f);
 
   if(dep<def){
     lquo=NEW_PPERM2(def);
@@ -4839,7 +4829,7 @@
   if(def==0) return EmptyPartialPerm;
   
   dep=DEG_PERM4(p);
-  dom=DOM_PPERM4(f);
+  dom=DOM_PPERM(f);
 
   if(dep<def){
     lquo=NEW_PPERM4(def);
@@ -4913,7 +4903,7 @@
  
   ptf=ADDR_PPERM2(f);
   ptg=ADDR_PPERM2(g);
-  dom=DOM_PPERM2(g);
+  dom=DOM_PPERM(g);
   del=0;
   codef=CODEG_PPERM2(f); 
   codel=0;
@@ -5009,7 +4999,7 @@
  
   ptf=ADDR_PPERM2(f);
   ptg=ADDR_PPERM4(g);
-  dom=DOM_PPERM4(g);
+  dom=DOM_PPERM(g);
   del=0;
   codef=CODEG_PPERM2(f); 
   codel=0;
@@ -5105,7 +5095,7 @@
  
   ptf=ADDR_PPERM4(f);
   ptg=ADDR_PPERM2(g);
-  dom=DOM_PPERM2(g);
+  dom=DOM_PPERM(g);
   del=0;
   codef=CODEG_PPERM4(f); 
   codel=0;
@@ -5200,7 +5190,7 @@
  
   ptf=ADDR_PPERM4(f);
   ptg=ADDR_PPERM4(g);
-  dom=DOM_PPERM4(g);
+  dom=DOM_PPERM(g);
   del=0;
   codef=CODEG_PPERM4(f); 
   codel=0;
@@ -5497,14 +5487,11 @@
 /* other internal things */
 
 /* so that domain and image set are preserved during garbage collection */
-void MarkPPerm2SubBags( Obj f ){
-  MARK_BAG(IMG_PPERM2(f));
-  MARK_BAG(DOM_PPERM2(f));
-}
-
-void MarkPPerm4SubBags( Obj f ){
-  MARK_BAG(IMG_PPERM4(f));
-  MARK_BAG(DOM_PPERM4(f));
+void MarkPPermSubBags( Obj f ){
+  if(IMG_PPERM(f)!=NULL){
+    MARK_BAG(IMG_PPERM(f));
+    MARK_BAG(DOM_PPERM(f));
+  }
 }
 
 /* Save and load */
@@ -5512,7 +5499,7 @@
   UInt2 *ptr;
   UInt  len, i;
   len=DEG_PPERM2(f);
-  ptr=((UInt2*)(ADDR_OBJ(f)));
+  ptr=ADDR_PPERM2(f)-1;
   for (i = 0; i < len+1; i++) SaveUInt2(*ptr++);
 }
 
@@ -5520,7 +5507,7 @@
   UInt2 *ptr;
   UInt  len, i;
   len=DEG_PPERM2(f);
-  ptr=((UInt2*)(ADDR_OBJ(f)));
+  ptr=ADDR_PPERM2(f)-1;
   for (i = 0; i < len+1; i++) *ptr++=LoadUInt2();
 }
 
@@ -5528,7 +5515,7 @@
   UInt4 *ptr;
   UInt  len, i;
   len=DEG_PPERM4(f);
-  ptr=((UInt4*)(ADDR_OBJ(f)));
+  ptr=ADDR_PPERM4(f)-1;
   for (i = 0; i < len+1; i++) SaveUInt4(*ptr++);
 }
 
@@ -5536,7 +5523,7 @@
   UInt4 *ptr;
   UInt  len, i;
   len=DEG_PPERM4(f);
-  ptr=((UInt4*)(ADDR_OBJ(f)));
+  ptr=ADDR_PPERM4(f)-1;
   for (i = 0; i < len+1; i++) *ptr++=LoadUInt4();
 }
 
@@ -5768,8 +5755,8 @@
     /* install the marking function                                        */
     InfoBags[ T_PPERM2 ].name = "partial perm (small)";
     InfoBags[ T_PPERM4 ].name = "partial perm (large)";
-    InitMarkFuncBags( T_PPERM2, MarkPPerm2SubBags );
-    InitMarkFuncBags( T_PPERM4, MarkPPerm4SubBags );
+    InitMarkFuncBags( T_PPERM2, MarkPPermSubBags );
+    InitMarkFuncBags( T_PPERM4, MarkPPermSubBags );
     
     /* install the kind function                                           */
     ImportGVarFromLibrary( "TYPE_PPERM2", &TYPE_PPERM2 );
Index: gap-4r7p3/src/trans.c
===================================================================
--- gap-4r7p3.orig/src/trans.c	2014-02-24 20:26:00.000000000 +0000
+++ gap-4r7p3/src/trans.c	2014-02-25 13:44:59.000000000 +0000
@@ -2,7 +2,7 @@
 **
 ** A transformation is of the form: 
 **
-** [entries image list, image set, flat kernel, external degree]
+** [image set, flat kernel, external degree, entries image list ]
 **
 ** An element of the internal rep of a transformation in T_TRANS2 must be at
 ** most 65536 and be of UInt2. 
@@ -17,44 +17,38 @@
 #define MIN(a,b)          (a<b?a:b)
 #define MAX(a,b)          (a<b?b:a)
 
-#define NEW_TRANS2(deg)       NewBag(T_TRANS2, deg*sizeof(UInt2)+3*sizeof(Obj))
-#define ADDR_TRANS2(f)        ((UInt2*)(ADDR_OBJ(f)))
-#define IMG_TRANS2(f)         (*((Obj*)(ADDR_TRANS2(f)+DEG_TRANS2(f))))
-#define KER_TRANS2(f)         (*((Obj*)(ADDR_TRANS2(f)+DEG_TRANS2(f))+1))
-#define EXT_TRANS2(f)         (*((Obj*)(ADDR_TRANS2(f)+DEG_TRANS2(f))+2))
-#define DEG_TRANS2(f)         ((UInt)(SIZE_OBJ(f)-3*sizeof(Obj))/sizeof(UInt2))
-#define RANK_TRANS2(f)        (IMG_TRANS2(f)==NULL?INIT_TRANS2(f):LEN_PLIST(IMG_TRANS2(f)))
-
-#define NEW_TRANS4(deg)       NewBag(T_TRANS4, deg*sizeof(UInt4)+3*sizeof(Obj))
-#define ADDR_TRANS4(f)        ((UInt4*)(ADDR_OBJ(f)))
-#define IMG_TRANS4(f)         (*((Obj*)(ADDR_TRANS4(f)+DEG_TRANS4(f))))
-#define KER_TRANS4(f)         (*((Obj*)(ADDR_TRANS4(f)+DEG_TRANS4(f))+1))
-#define EXT_TRANS4(f)         (*((Obj*)(ADDR_TRANS4(f)+DEG_TRANS4(f))+2))
-#define DEG_TRANS4(f)         ((UInt)(SIZE_OBJ(f)-3*sizeof(Obj))/sizeof(UInt4))
-#define RANK_TRANS4(f)        (IMG_TRANS4(f)==NULL?INIT_TRANS4(f):LEN_PLIST(IMG_TRANS4(f)))
+#define IMG_TRANS(f)       (*(Obj*)(ADDR_OBJ(f)))
+#define KER_TRANS(f)       (*((Obj*)(ADDR_OBJ(f))+1))
+#define EXT_TRANS(f)       (*((Obj*)(ADDR_OBJ(f))+2))
+
+#define NEW_TRANS2(deg)     NewBag(T_TRANS2, deg*sizeof(UInt2)+3*sizeof(Obj))
+#define ADDR_TRANS2(f)      ((UInt2*)((Obj*)(ADDR_OBJ(f))+3))
+#define DEG_TRANS2(f)       ((UInt)(SIZE_OBJ(f)-3*sizeof(Obj))/sizeof(UInt2))
+#define RANK_TRANS2(f)      (IMG_TRANS(f)==NULL?INIT_TRANS2(f):LEN_PLIST(IMG_TRANS(f)))
+
+#define NEW_TRANS4(deg)     NewBag(T_TRANS4, deg*sizeof(UInt4)+3*sizeof(Obj))
+#define ADDR_TRANS4(f)      ((UInt4*)((Obj*)(ADDR_OBJ(f))+3))
+#define DEG_TRANS4(f)       ((UInt)(SIZE_OBJ(f)-3*sizeof(Obj))/sizeof(UInt4))
+#define RANK_TRANS4(f)      (IMG_TRANS(f)==NULL?INIT_TRANS4(f):LEN_PLIST(IMG_TRANS(f)))
 
 #define IS_TRANS(f)       (TNUM_OBJ(f)==T_TRANS2||TNUM_OBJ(f)==T_TRANS4)
 #define RANK_TRANS(f)     (TNUM_OBJ(f)==T_TRANS2?RANK_TRANS2(f):RANK_TRANS4(f))
 #define DEG_TRANS(f)      (TNUM_OBJ(f)==T_TRANS2?DEG_TRANS2(f):DEG_TRANS4(f))
-#define IMG_TRANS(f)      (TNUM_OBJ(f)==T_TRANS2?IMG_TRANS2(f):IMG_TRANS4(f))
-#define KER_TRANS(f)      (TNUM_OBJ(f)==T_TRANS2?KER_TRANS2(f):KER_TRANS4(f))
 
 Obj FuncHAS_KER_TRANS( Obj self, Obj f ){
-  if(TNUM_OBJ(f)==T_TRANS2){
-    return (KER_TRANS2(f)==NULL?False:True);
-  } else if (TNUM_OBJ(f)==T_TRANS4){
-    return (KER_TRANS4(f)==NULL?False:True);
+  if(IS_TRANS(f)){
+    return (KER_TRANS(f)==NULL?False:True);
+  } else {
+    return Fail;
   }
-  return Fail;
 }
 
 Obj FuncHAS_IMG_TRANS( Obj self, Obj f ){
-  if(TNUM_OBJ(f)==T_TRANS2){
-    return (IMG_TRANS2(f)==NULL?False:True);
-  } else if (TNUM_OBJ(f)==T_TRANS4){
-    return (IMG_TRANS4(f)==NULL?False:True);
+  if(IS_TRANS(f)){
+    return (IMG_TRANS(f)==NULL?False:True);
+  } else {
+    return Fail;
   }
-  return Fail;
 }
 
 Obj FuncINT_DEG_TRANS( Obj self, Obj f ){
@@ -94,7 +88,7 @@
   if(SIZE_OBJ(TmpTrans)<len*sizeof(UInt4)){
     ResizeBag(TmpTrans,len*sizeof(UInt4));
   }
-  pttmp=ADDR_TRANS4(TmpTrans);
+  pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
   for(i=0;i<len;i++) pttmp[i]=0;
   return pttmp;
 }
@@ -112,8 +106,8 @@
   if(deg==0){//special case for degree 0
     img=NEW_PLIST(T_PLIST_EMPTY, 0);
     SET_LEN_PLIST(img, 0);
-    IMG_TRANS2(f)=img;
-    KER_TRANS2(f)=img;
+    IMG_TRANS(f)=img;
+    KER_TRANS(f)=img;
     CHANGED_BAG(f);
     return 0;
   }
@@ -138,8 +132,8 @@
   SHRINK_PLIST(img, (Int) rank);
   SET_LEN_PLIST(img, (Int) rank);
   
-  IMG_TRANS2(f)=img;
-  KER_TRANS2(f)=ker;
+  IMG_TRANS(f)=img;
+  KER_TRANS(f)=ker;
   CHANGED_BAG(f);
   return rank;
 }
@@ -156,8 +150,8 @@
   if(deg==0){//special case for degree 0
     img=NEW_PLIST(T_PLIST_EMPTY, 0);
     SET_LEN_PLIST(img, 0);
-    IMG_TRANS4(f)=img;
-    KER_TRANS4(f)=img;
+    IMG_TRANS(f)=img;
+    KER_TRANS(f)=img;
     CHANGED_BAG(f);
     return 0;
   }
@@ -182,8 +176,8 @@
   SHRINK_PLIST(img, (Int) rank);
   SET_LEN_PLIST(img, (Int) rank);
   
-  IMG_TRANS4(f)=img;
-  KER_TRANS4(f)=ker;
+  IMG_TRANS(f)=img;
+  KER_TRANS(f)=ker;
   CHANGED_BAG(f);
   return rank;
 }
@@ -314,44 +308,41 @@
   UInt4   *ptf4;
   Obj     ext;
 
-  if(TNUM_OBJ(f)==T_TRANS2){ 
-    ext=EXT_TRANS2(f);
-    if(ext==NULL){
-      n=DEG_TRANS2(f);
-      ptf2=ADDR_TRANS2(f);
-      if(ptf2[n-1]!=n-1){
-        ext=INTOBJ_INT(n);
-      } else {
-        deg=0;
-        for(i=0;i<n;i++){ 
-          if(ptf2[i]>i&&ptf2[i]+1>deg){
-            deg=ptf2[i]+1;
-          } else if(ptf2[i]<i&&i+1>deg){
-            deg=i+1;
-          }
-        }  
-        ext=INTOBJ_INT(deg);
-      }
+  ext=EXT_TRANS(f);
+  if(ext!=NULL){
+    return ext;
+  } else if(TNUM_OBJ(f)==T_TRANS2){ 
+    n=DEG_TRANS2(f);
+    ptf2=ADDR_TRANS2(f);
+    if(ptf2[n-1]!=n-1){
+      ext=INTOBJ_INT(n);
+    } else {
+      deg=0;
+      for(i=0;i<n;i++){ 
+        if(ptf2[i]>i&&ptf2[i]+1>deg){
+          deg=ptf2[i]+1;
+        } else if(ptf2[i]<i&&i+1>deg){
+          deg=i+1;
+        }
+      }  
+      ext=INTOBJ_INT(deg);
     }
     return ext;
   } else if (TNUM_OBJ(f)==T_TRANS4){
-    ext=EXT_TRANS4(f);
-    if(ext==NULL){
-      n=DEG_TRANS4(f);
-      ptf4=ADDR_TRANS4(f);
-      if(ptf4[n-1]!=n-1){
-        ext=INTOBJ_INT(n);
-      } else {
-        deg=0;
-        for(i=0;i<n;i++){ 
-          if(ptf4[i]>i&&ptf4[i]+1>deg){
-            deg=ptf4[i]+1;
-          } else if(ptf4[i]<i&&i+1>deg){
-            deg=i+1;
-          }
-        }  
-        ext=INTOBJ_INT(deg);
-      }
+    n=DEG_TRANS4(f);
+    ptf4=ADDR_TRANS4(f);
+    if(ptf4[n-1]!=n-1){
+      ext=INTOBJ_INT(n);
+    } else {
+      deg=0;
+      for(i=0;i<n;i++){ 
+        if(ptf4[i]>i&&ptf4[i]+1>deg){
+          deg=ptf4[i]+1;
+        } else if(ptf4[i]<i&&i+1>deg){
+          deg=i+1;
+        }
+      }  
+      ext=INTOBJ_INT(deg);
     }
     return ext;
   }
@@ -672,16 +663,16 @@
 }
 
 /* kernel of transformation */
-//unchanged
 Obj FuncFLAT_KERNEL_TRANS (Obj self, Obj f){ 
 
-  if(TNUM_OBJ(f)==T_TRANS2){
-    if(KER_TRANS2(f)==NULL) INIT_TRANS2(f);
-    return KER_TRANS2(f);
-  } else {
-    if(KER_TRANS4(f)==NULL) INIT_TRANS4(f);
-    return KER_TRANS4(f);
+  if(KER_TRANS(f)==NULL){
+    if(TNUM_OBJ(f)==T_TRANS2){
+      INIT_TRANS2(f);
+    } else {
+      INIT_TRANS4(f);
+    }
   }
+  return KER_TRANS(f);
 } 
 
 Obj FuncFLAT_KERNEL_TRANS_INT (Obj self, Obj f, Obj n){
@@ -690,10 +681,10 @@
 
   m=INT_INTOBJ(n);
   if(TNUM_OBJ(f)==T_TRANS2){
-    if(KER_TRANS2(f)==NULL) INIT_TRANS2(f);
+    if(KER_TRANS(f)==NULL) INIT_TRANS2(f);
     deg=DEG_TRANS2(f);
     if(m==deg){
-      return KER_TRANS2(f);
+      return KER_TRANS(f);
     } else if(m==0){
       new=NEW_PLIST(T_PLIST_EMPTY, 0);
       SET_LEN_PLIST(new, 0);
@@ -702,7 +693,7 @@
       new=NEW_PLIST(T_PLIST_CYC_NSORT, m);
       SET_LEN_PLIST(new, m);
       
-      ptker=ADDR_OBJ(KER_TRANS2(f))+1;
+      ptker=ADDR_OBJ(KER_TRANS(f))+1;
       ptnew=ADDR_OBJ(new)+1;
 
       //copy the kernel set up to minimum of m, deg
@@ -716,10 +707,10 @@
       return new;
     }
   }else{
-    if(KER_TRANS4(f)==NULL) INIT_TRANS4(f);
+    if(KER_TRANS(f)==NULL) INIT_TRANS4(f);
     deg=DEG_TRANS4(f);
     if(m==deg){
-      return KER_TRANS4(f);
+      return KER_TRANS(f);
     } else if(m==0){
       new=NEW_PLIST(T_PLIST_EMPTY, 0);
       SET_LEN_PLIST(new, 0);
@@ -728,7 +719,7 @@
       new=NEW_PLIST(T_PLIST_CYC_NSORT, m);
       SET_LEN_PLIST(new, m);
       
-      ptker=ADDR_OBJ(KER_TRANS4(f))+1;
+      ptker=ADDR_OBJ(KER_TRANS(f))+1;
       ptnew=ADDR_OBJ(new)+1;
 
       //copy the kernel set up to minimum of m, deg
@@ -745,24 +736,18 @@
 }
 
 /* image set of transformation */
-//unchanged-changed
 Obj FuncIMAGE_SET_TRANS (Obj self, Obj f){ 
-  if(TNUM_OBJ(f)==T_TRANS2){
-    if(IMG_TRANS2(f)==NULL){
+  if(IMG_TRANS(f)==NULL){
+    if(TNUM_OBJ(f)==T_TRANS2){
       INIT_TRANS2(f);
+    } else {
+      INIT_TRANS4(f);
     }
-    if(!IS_SSORT_LIST(IMG_TRANS2(f))){
-      return SORT_PLIST_CYC(IMG_TRANS2(f));
-    }
-    return IMG_TRANS2(f);  
   }
- if(IMG_TRANS4(f)==NULL){
-    INIT_TRANS4(f);
-    return SORT_PLIST_CYC(IMG_TRANS4(f));
-  } else if(!IS_SSORT_LIST(IMG_TRANS4(f))){
-    return SORT_PLIST_CYC(IMG_TRANS4(f));
+  if(!IS_SSORT_LIST(IMG_TRANS(f))){
+    return SORT_PLIST_CYC(IMG_TRANS(f));
   }
-  return IMG_TRANS4(f);
+  return IMG_TRANS(f);  
 } 
 
 //the image set of <f> when applied to <1..n> 
@@ -786,7 +771,7 @@
   } else if(m<deg){
     pttmp=ResizeInitTmpTrans(deg);
     new=NEW_PLIST(T_PLIST_CYC+IMMUTABLE, m);
-    pttmp=ADDR_TRANS4(TmpTrans);
+    pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
     
     if(TNUM_OBJ(f)==T_TRANS2){
       ptf2=ADDR_TRANS2(f);
@@ -901,10 +886,10 @@
       nr++;
       SET_ELM_PLIST(ker, j, NEW_PLIST(T_PLIST_CYC_SSORT, len));
       CHANGED_BAG(ker);
-      pttmp=ADDR_TRANS4(TmpTrans);
+      pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
     }
     AssPlist(ELM_PLIST(ker, j), (Int) ++pttmp[j-1], INTOBJ_INT(i+1));
-    pttmp=ADDR_TRANS4(TmpTrans);
+    pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
   }
   
   for(i=0;i<nr;i++){
@@ -1017,8 +1002,8 @@
       ptf2[i]=i;
       ptimg[i]=INTOBJ_INT(i+1);
     }
-    IMG_TRANS2(f)=img;
-    KER_TRANS2(f)=img;
+    IMG_TRANS(f)=img;
+    KER_TRANS(f)=img;
     CHANGED_BAG(f);
   } else { //def>65536
     f=NEW_TRANS4(def);
@@ -1042,8 +1027,8 @@
       ptf4[i]=i;
       ptimg[i]=INTOBJ_INT(i+1);
     }
-    IMG_TRANS4(f)=img;
-    KER_TRANS4(f)=img;
+    IMG_TRANS(f)=img;
+    KER_TRANS(f)=img;
     CHANGED_BAG(f);
   }
   
@@ -1121,12 +1106,12 @@
     p=NEW_PERM2(deg);
     ResizeTmpTrans(deg); 
     
-    pttmp=ADDR_TRANS4(TmpTrans);
+    pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
     ptp2=ADDR_PERM2(p);
     for(i=0;i<deg;i++){ pttmp[i]=0; ptp2[i]=i; }
     
     ptf2=ADDR_TRANS2(f);
-    img=IMG_TRANS2(f);
+    img=IMG_TRANS(f);
    
     for(i=0;i<rank;i++){
       j=INT_INTOBJ(ELM_PLIST(img, i+1))-1;    /* ranset(f)[i] */ 
@@ -1142,12 +1127,12 @@
     p=NEW_PERM4(deg);
     ResizeTmpTrans(deg);
 
-    pttmp=ADDR_TRANS4(TmpTrans);
+    pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
     ptp4=ADDR_PERM4(p);
     for(i=0;i<deg;i++){ pttmp[i]=0; ptp4[i]=i; }
     
     ptf4=ADDR_TRANS4(f);
-    img=IMG_TRANS4(f);
+    img=IMG_TRANS(f);
    
     for(i=0;i<rank;i++){
       j=INT_INTOBJ(ELM_PLIST(img, i+1))-1;    /* ranset(f)[i] */ 
@@ -1258,8 +1243,8 @@
   return g;
 }
 
-// it is assumed that f is actually a transformation of [1..m]
-//new
+// it is assumed that f is actually a transformation of [1..m], i.e. that i^f<=m
+// for all i in [1..m]
 Obj FuncTRIM_TRANS (Obj self, Obj f, Obj m){
   UInt    deg, i;
   UInt4   *ptf;
@@ -1270,31 +1255,23 @@
 
   deg=INT_INTOBJ(m);
 
-  if(TNUM_OBJ(f)==T_TRANS2){
-    if(deg>DEG_TRANS2(f)) return f;
-    ResizeBag(f, deg*sizeof(UInt2)+2*sizeof(Obj));
-    IMG_TRANS2(f)=NULL;
-    KER_TRANS2(f)=NULL;
-  } else {
-    if(deg>DEG_TRANS4(f)) return f;
-    if(deg>65536UL){
-      ResizeBag(f, deg*sizeof(UInt4)+2*sizeof(Obj));
-      IMG_TRANS4(f)=NULL;
-      KER_TRANS4(f)=NULL;
-    } else {
-      ptf=((UInt4*)(ADDR_OBJ(f)));
+  if(TNUM_OBJ(f)==T_TRANS2){  // output is T_TRANS2
+    if(deg>DEG_TRANS2(f)) return (Obj)0;
+    ResizeBag(f, deg*sizeof(UInt2)+3*sizeof(Obj));
+  } else if (TNUM_OBJ(f)==T_TRANS4){
+    if(deg>DEG_TRANS4(f)) return (Obj)0;
+    if(deg>65536UL){          // output is T_TRANS4
+      ResizeBag(f, deg*sizeof(UInt4)+3*sizeof(Obj));
+    } else {                  // output is T_TRANS2
+      ptf=ADDR_TRANS4(f);
       for(i=0;i<deg;i++) ((UInt2*)ptf)[i]=(UInt2)ptf[i];
-      if((*((Obj*)(ptf+deg)+1))!=NULL&&deg==DEG_TRANS4(f)){
-        (*((Obj*)((UInt2*)ptf+deg)  ))=(*((Obj*)(ptf+deg)  ));
-        (*((Obj*)((UInt2*)ptf+deg)+1))=(*((Obj*)(ptf+deg)+1)); 
-      } else {
-        (*((Obj*)((UInt2*)ptf+deg)  ))=NULL;
-        (*((Obj*)((UInt2*)ptf+deg)+1))=NULL;
-      }
       RetypeBag(f, T_TRANS2);
-      ResizeBag(f, deg*sizeof(UInt2)+2*sizeof(Obj));
+      ResizeBag(f, deg*sizeof(UInt2)+3*sizeof(Obj));
     }
   }
+  IMG_TRANS(f)=NULL;
+  KER_TRANS(f)=NULL;
+  EXT_TRANS(f)=NULL;
   CHANGED_BAG(f);
   return (Obj)0;
 }
@@ -1427,7 +1404,6 @@
 }
 
 /* transformation from image set and flat kernel, no checking*/
-//unchanged
 Obj FuncTRANS_IMG_KER_NC(Obj self, Obj img, Obj ker){
   UInt    deg=LEN_LIST(ker);
   Obj     f;
@@ -1438,22 +1414,18 @@
   if(deg<=65536){
     f=NEW_TRANS2(deg);
     ptf2=ADDR_TRANS2(f);
-    IMG_TRANS2(f)=img;
-    KER_TRANS2(f)=ker;
-
     for(i=0;i<deg;i++){
       ptf2[i]=INT_INTOBJ(ELM_LIST(img, INT_INTOBJ(ELM_LIST(ker, i+1))))-1;
     }
   }else{
     f=NEW_TRANS4(deg);
     ptf4=ADDR_TRANS4(f);
-    IMG_TRANS4(f)=img;
-    KER_TRANS4(f)=ker;
-        
     for(i=0;i<deg;i++){
       ptf4[i]=INT_INTOBJ(ELM_LIST(img, INT_INTOBJ(ELM_LIST(ker, i+1))))-1;
     }   
   }
+  IMG_TRANS(f)=img;
+  KER_TRANS(f)=ker;
   CHANGED_BAG(f);
   return f;
 }
@@ -1476,7 +1448,7 @@
   if(IS_MUTABLE_OBJ(ker)) RetypeBag(ker, TNUM_OBJ(ker)+IMMUTABLE);
 
   ResizeTmpTrans(deg);
-  pttmp=ADDR_TRANS4(TmpTrans);
+  pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
   
   // setup the lookup table
   for(i=0;i<rank;i++){
@@ -1486,22 +1458,18 @@
   if(deg<=65536){
     f=NEW_TRANS2(deg);
     ptf2=ADDR_TRANS2(f);
-    pttmp=ADDR_TRANS4(TmpTrans); 
-
-    IMG_TRANS2(f)=img;
-    KER_TRANS2(f)=ker;
+    pttmp=(UInt4*)(ADDR_OBJ(TmpTrans)); 
 
     for(i=0;i<deg;i++) ptf2[i]=pttmp[INT_INTOBJ(ELM_PLIST(ker, i+1))-1];
   }else{
     f=NEW_TRANS4(deg);
     ptf4=ADDR_TRANS4(f);
-    pttmp=ADDR_TRANS4(TmpTrans); 
+    pttmp=(UInt4*)(ADDR_OBJ(TmpTrans)); 
     
-    IMG_TRANS4(f)=img;
-    KER_TRANS4(f)=ker;
-
     for(i=0;i<deg;i++) ptf4[i]=pttmp[INT_INTOBJ(ELM_PLIST(ker, i+1))-1];
   }
+  IMG_TRANS(f)=img;
+  KER_TRANS(f)=ker;
   CHANGED_BAG(f);
   return f;
 }
@@ -1593,8 +1561,8 @@
   if(TNUM_OBJ(f)==T_TRANS2){
     perm=NEW_PERM2(deg);
 
-    ptsrc=ADDR_TRANS4(TmpTrans);
-    ptdst=ADDR_TRANS4(TmpTrans)+deg;
+    ptsrc=(UInt4*)(ADDR_OBJ(TmpTrans));
+    ptdst=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
     ptp2=ADDR_PERM2(perm);
     ptf2=ADDR_TRANS2(f);
     ptg2=ADDR_TRANS2(g);
@@ -1615,8 +1583,8 @@
   } else {
     perm=NEW_PERM4(deg);
 
-    ptsrc=ADDR_TRANS4(TmpTrans);
-    ptdst=ADDR_TRANS4(TmpTrans)+deg;
+    ptsrc=(UInt4*)(ADDR_OBJ(TmpTrans));
+    ptdst=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
     ptp4=ADDR_PERM4(perm);
     ptf4=ADDR_TRANS4(f);
     ptg4=ADDR_TRANS4(g);
@@ -1651,9 +1619,9 @@
   
   ResizeTmpTrans(3*deg);
   
-  ptseen=ADDR_TRANS4(TmpTrans);
-  ptlast=ADDR_TRANS4(TmpTrans)+deg;
-  ptcurrent=ADDR_TRANS4(TmpTrans)+2*deg;
+  ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
+  ptlast=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
+  ptcurrent=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
   
   if(TNUM_OBJ(f)==T_TRANS2){
     ptf2=ADDR_TRANS2(f);
@@ -1888,7 +1856,7 @@
     deg=DEG_TRANS2(f);
     if(len<=65536){   // deg(g)<=65536 and g is T_TRANS2
       g=NEW_TRANS2(len);
-      pttmp=ADDR_TRANS4(TmpTrans);
+      pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
       ptf2=ADDR_TRANS2(f);
       ptg2=ADDR_TRANS2(g);
       if(deg>=len){
@@ -1904,7 +1872,7 @@
       return g;
     } else {        // deg(g)>65536 and g is T_TRANS4
       g=NEW_TRANS4(len);
-      pttmp=ADDR_TRANS4(TmpTrans);
+      pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
       ptf2=ADDR_TRANS2(f);
       ptg4=ADDR_TRANS4(g);
       if(deg>=len){
@@ -1923,7 +1891,7 @@
     deg=DEG_TRANS4(f);
     if(len<=65536){   // deg(g)<=65536 and g is T_TRANS2
       g=NEW_TRANS2(len);
-      pttmp=ADDR_TRANS4(TmpTrans);
+      pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
       ptf4=ADDR_TRANS4(f);
       ptg2=ADDR_TRANS2(g);
       if(deg>=len){
@@ -1939,7 +1907,7 @@
       return g;
     } else {        // deg(g)>65536 and g is T_TRANS4
       g=NEW_TRANS4(len);
-      pttmp=ADDR_TRANS4(TmpTrans);
+      pttmp=(UInt4*)(ADDR_OBJ(TmpTrans));
       ptf4=ADDR_TRANS4(f);
       ptg4=ADDR_TRANS4(g);
       if(deg>=len){
@@ -2001,10 +1969,10 @@
   ResizeTmpTrans(4*deg);
   out=NEW_PLIST(T_PLIST, deg);
   
-  ptseen=ADDR_TRANS4(TmpTrans);
-  ptlookup=ADDR_TRANS4(TmpTrans)+deg;
-  ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
-  ptimg=ADDR_TRANS4(TmpTrans)+3*deg;
+  ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
+  ptlookup=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
+  ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
+  ptimg=(UInt4*)(ADDR_OBJ(TmpTrans))+3*deg;
     
   for(i=0;i<deg;i++){ ptseen[i]=0; ptlookup[i]=0; ptlens[i]=0; ptimg[i]=0; }
 
@@ -2026,7 +1994,7 @@
           ptlookup[m-1]=nr;
           SET_ELM_PLIST(out, ++nr, NEW_PLIST(T_PLIST_CYC_SSORT, deg-count));
           CHANGED_BAG(out);
-          ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
+          ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
         }else{ /* old component */
           k=ptlookup[ptseen[j]-1];
           ptlookup[m-1]=k;
@@ -2034,10 +2002,10 @@
         AssPlist(ELM_PLIST(out, k+1), ++ptlens[k], INTOBJ_INT(i+1));
       }
       ptf2=ADDR_TRANS2(f);
-      ptseen=ADDR_TRANS4(TmpTrans);
-      ptlookup=ADDR_TRANS4(TmpTrans)+deg;
-      ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
-      ptimg=ADDR_TRANS4(TmpTrans)+3*deg;
+      ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
+      ptlookup=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
+      ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
+      ptimg=(UInt4*)(ADDR_OBJ(TmpTrans))+3*deg;
     }
 
     for(i=0;i<nr;i++){
@@ -2045,7 +2013,7 @@
       SET_LEN_PLIST(ELM_PLIST(out, i+1), (Int) ptlens[i]);
     }
 
-    ptseen=ADDR_TRANS4(TmpTrans);
+    ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
     ptf2=ADDR_TRANS2(f);
 
     /* components corresponding to cycles */
@@ -2058,7 +2026,7 @@
         SET_ELM_PLIST(ELM_PLIST(out, nr), 1, INTOBJ_INT(i+1));
         CHANGED_BAG(out);
         
-        ptseen=ADDR_TRANS4(TmpTrans);
+        ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
         ptf2=ADDR_TRANS2(f);
       }
     }
@@ -2080,7 +2048,7 @@
           ptlookup[m-1]=nr;
           SET_ELM_PLIST(out, ++nr, NEW_PLIST(T_PLIST_CYC_SSORT, deg-count));
           CHANGED_BAG(out);
-          ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
+          ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
         }else{ /* old component */
           k=ptlookup[ptseen[j]-1];
           ptlookup[m-1]=k;
@@ -2088,10 +2056,10 @@
         AssPlist(ELM_PLIST(out, k+1), ++ptlens[k], INTOBJ_INT(i+1));
       }
       ptf4=ADDR_TRANS4(f); 
-      ptseen=ADDR_TRANS4(TmpTrans);
-      ptlookup=ADDR_TRANS4(TmpTrans)+deg;
-      ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
-      ptimg=ADDR_TRANS4(TmpTrans)+3*deg;
+      ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
+      ptlookup=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
+      ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
+      ptimg=(UInt4*)(ADDR_OBJ(TmpTrans))+3*deg;
     }
 
     for(i=0;i<nr-1;i++){
@@ -2099,7 +2067,7 @@
       SET_LEN_PLIST(ELM_PLIST(out, i+1), (Int) ptlens[i]);
     }
     
-    ptseen=ADDR_TRANS4(TmpTrans);
+    ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
     ptf4=ADDR_TRANS4(f);
 
     /* components corresponding to cycles */
@@ -2112,7 +2080,7 @@
         SET_ELM_PLIST(ELM_PLIST(out, nr), 1, INTOBJ_INT(i+1));
         CHANGED_BAG(out);
 
-        ptseen=ADDR_TRANS4(TmpTrans);
+        ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
         ptf4=ADDR_TRANS4(f);
       }
     }
@@ -2166,9 +2134,9 @@
   
   deg=INT_INTOBJ(FuncDegreeOfTransformation(self, f));
   ResizeTmpTrans(3*deg);
-  ptseen=ADDR_TRANS4(TmpTrans);
-  ptlookup=ADDR_TRANS4(TmpTrans)+deg;
-  ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
+  ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
+  ptlookup=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
+  ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
   
   for(i=0;i<deg;i++){ ptseen[i]=0; ptlookup[i]=0; ptlens[i]=0; }
 
@@ -2209,20 +2177,20 @@
 
   // install the points in out
   for(i=0;i<deg;i++){
-    ptseen=ADDR_TRANS4(TmpTrans);
-    ptlookup=ADDR_TRANS4(TmpTrans)+deg;
-    ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
+    ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
+    ptlookup=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
+    ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
     
     m=ptlookup[ptseen[i]-1];
     if(ptlens[m]==0){
       SET_ELM_PLIST(out, m+1, NEW_PLIST(T_PLIST_CYC_SSORT, deg));
       CHANGED_BAG(out);
-      ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
+      ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
     }
     AssPlist(ELM_PLIST(out, m+1), (Int) ++ptlens[m], INTOBJ_INT(i+1));
   }
   
-  ptlens=ADDR_TRANS4(TmpTrans)+2*deg;
+  ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+2*deg;
   for(i=0;i<nr;i++){
     SHRINK_PLIST(ELM_PLIST(out, i+1), (Int) ptlens[i]);
     SET_LEN_PLIST(ELM_PLIST(out, i+1), (Int) ptlens[i]);
@@ -2332,8 +2300,8 @@
   ResizeTmpTrans(deg+len_list);
   out=NEW_PLIST(T_PLIST, len_list);
   
-  ptseen=ADDR_TRANS4(TmpTrans);
-  ptlens=ADDR_TRANS4(TmpTrans)+deg;
+  ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
+  ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
 
   for(i=0;i<deg;i++){ ptseen[i]=0; ptlens[i]=0; }
   for(;i<len_list;i++){ ptlens[i]=0; }
@@ -2347,10 +2315,10 @@
         SET_ELM_PLIST(out, ++len_out, NEW_PLIST(T_PLIST_CYC, 1));
         SET_ELM_PLIST(ELM_PLIST(out, len_out), 1, INTOBJ_INT(pt+1));
         CHANGED_BAG(out);
-        ((ADDR_TRANS4(TmpTrans)+deg)[len_out])++; //ptlens[len_out]++
+        (((UInt4*)(ADDR_OBJ(TmpTrans))+deg)[len_out])++; //ptlens[len_out]++
       } else {
         m++;
-        ptseen=ADDR_TRANS4(TmpTrans);
+        ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
         ptf2=ADDR_TRANS2(f);
         while(ptseen[pt]==0){ //look for pts already seen
           ptseen[pt]=m;
@@ -2360,11 +2328,11 @@
           j=pt;
           SET_ELM_PLIST(out, ++len_out, NEW_PLIST(T_PLIST_CYC, 32));
           CHANGED_BAG(out);
-          ptlens=ADDR_TRANS4(TmpTrans)+deg;
+          ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
           do{ AssPlist(ELM_PLIST(out, len_out), ++ptlens[len_out], 
                INTOBJ_INT(j+1));
               j=(ADDR_TRANS2(f))[j];
-              ptlens=ADDR_TRANS4(TmpTrans)+deg;
+              ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
           }while(j!=pt);
         }
       }
@@ -2376,10 +2344,10 @@
         SET_ELM_PLIST(out, ++len_out, NEW_PLIST(T_PLIST_CYC, 1));
         SET_ELM_PLIST(ELM_PLIST(out, len_out), 1, INTOBJ_INT(pt+1));
         CHANGED_BAG(out);
-        ((ADDR_TRANS4(TmpTrans)+deg)[len_out])++; //ptlens[len_out]++
+        (((UInt4*)(ADDR_OBJ(TmpTrans))+deg)[len_out])++; //ptlens[len_out]++
       } else {
         m++;
-        ptseen=ADDR_TRANS4(TmpTrans);
+        ptseen=(UInt4*)(ADDR_OBJ(TmpTrans));
         ptf4=ADDR_TRANS4(f);
         while(ptseen[pt]==0){ //look for pts already seen
           ptseen[pt]=m;
@@ -2389,17 +2357,17 @@
           j=pt;
           SET_ELM_PLIST(out, ++len_out, NEW_PLIST(T_PLIST_CYC, 32));
           CHANGED_BAG(out);
-          ptlens=ADDR_TRANS4(TmpTrans)+deg;
+          ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
           do{ AssPlist(ELM_PLIST(out, len_out), ++ptlens[len_out], 
                INTOBJ_INT(j+1));
               j=(ADDR_TRANS4(f))[j];
-              ptlens=ADDR_TRANS4(TmpTrans)+deg;
+              ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
           }while(j!=pt);
         }
       }
     }
   }
-  ptlens=ADDR_TRANS4(TmpTrans)+deg;
+  ptlens=(UInt4*)(ADDR_OBJ(TmpTrans))+deg;
   for(i=1;i<=len_out;i++){
     SHRINK_PLIST (ELM_PLIST(out, i), (Int) ptlens[i]);
     SET_LEN_PLIST(ELM_PLIST(out, i), (Int) ptlens[i]);
@@ -2417,10 +2385,10 @@
 
   if(TNUM_OBJ(f)==T_TRANS2){
     rank=RANK_TRANS2(f);
-    ker=KER_TRANS2(f);
+    ker=KER_TRANS(f);
   } else {
     rank=RANK_TRANS4(f);
-    ker=KER_TRANS4(f);
+    ker=KER_TRANS(f);
   }
   img=NEW_PLIST(T_PLIST_CYC, rank);
   n=1;
@@ -3214,7 +3182,7 @@
   ResizeTmpTrans(SIZE_OBJ(p));
 
   /* invert the permutation into the buffer bag */
-  pttmp = ADDR_TRANS4(TmpTrans);
+  pttmp = (UInt4*)(ADDR_OBJ(TmpTrans));
   ptp =   ADDR_PERM2(p);
   for(i=0;i<dep;i++) pttmp[*ptp++]=i;
 
@@ -3244,7 +3212,7 @@
   ResizeTmpTrans(SIZE_OBJ(p));
 
   /* invert the permutation into the buffer bag */
-  pttmp = ADDR_TRANS4(TmpTrans);
+  pttmp = (UInt4*)(ADDR_OBJ(TmpTrans));
   ptp =   ADDR_PERM4(p);
   for(i=0;i<dep;i++) pttmp[*ptp++]=i;
 
@@ -3275,7 +3243,7 @@
   ResizeTmpTrans(SIZE_OBJ(p));
 
   /* invert the permutation into the buffer bag */
-  pttmp = ADDR_TRANS4(TmpTrans);
+  pttmp = (UInt4*)(ADDR_OBJ(TmpTrans));
   ptp =   ADDR_PERM2(p);
   for(i=0;i<dep;i++) pttmp[*ptp++]=i;
 
@@ -3305,7 +3273,7 @@
   ResizeTmpTrans(SIZE_OBJ(p));
 
   /* invert the permutation into the buffer bag */
-  pttmp = ADDR_TRANS4(TmpTrans);
+  pttmp = (UInt4*)(ADDR_OBJ(TmpTrans));
   ptp =   ADDR_PERM4(p);
   for(i=0;i<dep;i++) pttmp[*ptp++]=i;
 
@@ -3727,14 +3695,13 @@
 /* other internal things */
 
 /* so that kernel and image set are preserved during garbage collection */
-void MarkTrans2SubBags( Obj f ){
-  MARK_BAG(IMG_TRANS2(f));
-  MARK_BAG(KER_TRANS2(f));
-}
 
-void MarkTrans4SubBags( Obj f ){
-  MARK_BAG(IMG_TRANS4(f));
-  MARK_BAG(KER_TRANS4(f));
+void MarkTransSubBags( Obj f ){
+  if(IMG_TRANS(f)!=NULL){
+    MARK_BAG(IMG_TRANS(f));
+    MARK_BAG(KER_TRANS(f));
+    MARK_BAG(EXT_TRANS(f));
+  }
 }
 
 /* Save and load */
@@ -4054,8 +4021,8 @@
     /* install the marking function                                        */
     InfoBags[ T_TRANS2 ].name = "transformation (small)";
     InfoBags[ T_TRANS4 ].name = "transformation (large)";
-    InitMarkFuncBags( T_TRANS2, MarkTrans2SubBags );
-    InitMarkFuncBags( T_TRANS4, MarkTrans4SubBags );
+    InitMarkFuncBags( T_TRANS2, MarkTransSubBags );
+    InitMarkFuncBags( T_TRANS4, MarkTransSubBags );
     
     /* install the kind function                                           */
     ImportGVarFromLibrary( "TYPE_TRANS2", &TYPE_TRANS2 );
