Index: Singular/iparith.cc
===================================================================
--- Singular/iparith.cc	(revision 15fc5f19a9a19e268ea1f86d8e7d35f229908025)
+++ Singular/iparith.cc	(revision c3b7d1e50005f87334a9d524731b5af7c27cc823)
@@ -2166,5 +2166,10 @@
       }
     }
-    if ((iiOp!=FETCH_CMD) || (r->N!=currRing->N) || (rPar(r)!=rPar(currRing)))
+    if (
+        (iiOp!=FETCH_CMD) || (r->N!=currRing->N) || (rPar(r)!=rPar(currRing))
+#ifdef HAVE_SHIFTBBA
+          || rIsLPRing(currRing)
+#endif
+        )
     {
       perm=(int *)omAlloc0((r->N+1)*sizeof(int));
@@ -2205,8 +2210,17 @@
       else
       {
-        unsigned i;
-        if (par_perm_size!=0)
-          for(i=si_min(rPar(r),rPar(currRing));i>0;i--) par_perm[i-1]=-i;
-        for(i=si_min(r->N,currRing->N);i>0;i--) perm[i]=i;
+#ifdef HAVE_SHIFTBBA
+        if (rIsLPRing(currRing))
+        {
+          maFetchPermLP(r, currRing, perm);
+        }
+        else
+#endif
+        {
+          unsigned i;
+          if (par_perm_size!=0)
+            for(i=si_min(rPar(r),rPar(currRing));i>0;i--) par_perm[i-1]=-i;
+          for(i=si_min(r->N,currRing->N);i>0;i--) perm[i]=i;
+        }
       }
     }
Index: Singular/maps_ip.cc
===================================================================
--- Singular/maps_ip.cc	(revision 15fc5f19a9a19e268ea1f86d8e7d35f229908025)
+++ Singular/maps_ip.cc	(revision c3b7d1e50005f87334a9d524731b5af7c27cc823)
@@ -125,5 +125,10 @@
       break;
     case BUCKET_CMD:
-      if ((what==FETCH_CMD)&& (preimage_r->cf==currRing->cf))
+      if (
+          (what==FETCH_CMD) && (preimage_r->cf==currRing->cf)
+#ifdef HAVE_SHIFTBBA
+          && !rIsLPRing(currRing)
+#endif
+          )
         res->data=(void *)prCopyR(sBucketPeek((sBucket_pt)data), preimage_r, currRing);
       else
@@ -139,5 +144,10 @@
     case POLY_CMD:
     case VECTOR_CMD:
-      if ((what==FETCH_CMD)&& (preimage_r->cf==currRing->cf))
+      if (
+          (what==FETCH_CMD) && (preimage_r->cf==currRing->cf)
+#ifdef HAVE_SHIFTBBA
+          && !rIsLPRing(currRing)
+#endif
+          )
         res->data=(void *)prCopyR( (poly)data, preimage_r, currRing);
       else
@@ -169,5 +179,10 @@
         ((matrix)data)->rank=((matrix)data)->rows();
       }
-      if ((what==FETCH_CMD)&& (preimage_r->cf == currRing->cf))
+      if (
+          (what==FETCH_CMD) && (preimage_r->cf == currRing->cf)
+#ifdef HAVE_SHIFTBBA
+          && !rIsLPRing(currRing)
+#endif
+         )
       {
         for (i=R*C-1;i>=0;i--)
Index: Singular/table.h
===================================================================
--- Singular/table.h	(revision 15fc5f19a9a19e268ea1f86d8e7d35f229908025)
+++ Singular/table.h	(revision c3b7d1e50005f87334a9d524731b5af7c27cc823)
@@ -922,5 +922,5 @@
 ,{D(jjDBPRINT),   DBPRINT_CMD,     NONE,               -2      , ALLOW_NC |ALLOW_RING}
 //,{D(jjEXPORTTO_M),  EXPORTTO_CMD,    NONE,             -2      , ALLOW_NC |ALLOW_RING}
-,{D(jjCALL2ARG),  FETCH_CMD,       ANY_TYPE/*or set by p*/,2   , ALLOW_PLURAL |ALLOW_RING}
+,{D(jjCALL2ARG),  FETCH_CMD,       ANY_TYPE/*or set by p*/,2   , ALLOW_NC |ALLOW_RING}
 ,{D(jjFETCH_M),   FETCH_CMD,       ANY_TYPE/*or set by p*/,3   , ALLOW_PLURAL |ALLOW_RING}
 ,{D(jjFETCH_M),   FETCH_CMD,       ANY_TYPE/*or set by p*/,4   , ALLOW_PLURAL |ALLOW_RING}
Index: libpolys/polys/monomials/maps.cc
===================================================================
--- libpolys/polys/monomials/maps.cc	(revision 15fc5f19a9a19e268ea1f86d8e7d35f229908025)
+++ libpolys/polys/monomials/maps.cc	(revision c3b7d1e50005f87334a9d524731b5af7c27cc823)
@@ -300,4 +300,35 @@
         }
       }
+    }
+  }
+}
+
+void maFetchPermLP(const ring preimage_r, const ring dst_r, int * perm)
+/* perm=(int *)omAlloc0(preimage_r->N+1 * sizeof(int)); */
+{
+  for (int i = 0; i < preimage_r->N + 1; i++) { perm[i] = 0; }
+
+  int preimage_lV = preimage_r->isLPring;
+  int r_lV = dst_r->isLPring;
+
+  int preimage_ncgens = preimage_r->LPncGenCount;
+  int r_ncges = dst_r->LPncGenCount;
+
+  int preimage_vars = preimage_lV - preimage_ncgens;
+  int r_vars = r_lV - r_ncges;
+
+  // for each block
+  for (int i = 0; i < si_min(preimage_r->N / preimage_lV, dst_r->N / r_lV); i++)
+  {
+    // align variables
+    for (int j = 1; j <= si_min(preimage_vars, r_vars); j++)
+    {
+      perm[(i * preimage_lV) + j] = (i * r_lV) + j;
+    }
+
+    // align ncgens
+    for (int j = 1; j <= si_min(preimage_ncgens, r_ncges); j++)
+    {
+      perm[(i * preimage_lV) + preimage_vars + j] = (i * r_lV) + r_vars + j;
     }
   }
Index: libpolys/polys/monomials/maps.h
===================================================================
--- libpolys/polys/monomials/maps.h	(revision 15fc5f19a9a19e268ea1f86d8e7d35f229908025)
+++ libpolys/polys/monomials/maps.h	(revision c3b7d1e50005f87334a9d524731b5af7c27cc823)
@@ -24,4 +24,5 @@
                 char const * const * const names,       int n,       char const * const * const par,       int nop,
                 int * perm, int *par_perm, n_coeffType ch, int lV);
+void maFetchPermLP(const ring preimage_r, const ring dst_r, int * perm);
 #endif
 poly pSubstPoly(poly p, int var, poly image);
