Index: Singular/ipshell.cc
===================================================================
--- Singular/ipshell.cc	(revision 232b0953a6412f9a34b3e57519d0c19ff4cfb73c)
+++ Singular/ipshell.cc	(revision 2bcf4bf587e11f75f4c6a2263c9c96038f75b0e8)
@@ -2155,9 +2155,10 @@
     LLL->m[0].data=(void *)omStrDup(rSimpleOrdStr(r->order[i]));
 
-    if(r->order[i] == ringorder_IS) //  || r->order[i] == ringorder_s || r->order[i] == ringorder_S)
+    if((r->order[i] == ringorder_IS)
+    || (r->order[i] == ringorder_s)) //|| r->order[i] == ringorder_S)
     {
       assume( r->block0[i] == r->block1[i] );
       const int s = r->block0[i];
-      assume( -2 < s && s < 2);
+      assume( (-2 < s && s < 2)||(r->order[i] != ringorder_IS));
 
       iv=new intvec(1);
@@ -2568,11 +2569,14 @@
           iv=ivCopy((intvec*)vv->m[1].Data()); //assume INTVEC
         int iv_len=iv->length();
-        R->block1[j_in_R]=si_max(R->block0[j_in_R],R->block0[j_in_R]+iv_len-1);
-        if (R->block1[j_in_R]>R->N)
+        if (R->order[j_in_R]!=ringorder_s)
         {
-          R->block1[j_in_R]=R->N;
-          iv_len=R->block1[j_in_R]-R->block0[j_in_R]+1;
+          R->block1[j_in_R]=si_max(R->block0[j_in_R],R->block0[j_in_R]+iv_len-1);
+          if (R->block1[j_in_R]>R->N)
+          {
+            R->block1[j_in_R]=R->N;
+            iv_len=R->block1[j_in_R]-R->block0[j_in_R]+1;
+          }
+          //Print("block %d from %d to %d\n",j,R->block0[j], R->block1[j]);
         }
-        //Print("block %d from %d to %d\n",j,R->block0[j], R->block1[j]);
         int i;
         switch (R->order[j_in_R])
@@ -2632,4 +2636,6 @@
 
            case ringorder_s:
+             R->block1[j_in_R]=R->block0[j_in_R]=(*iv)[0];
+             rSetSyzComp(R->block0[j_in_R],R);
              break;
 
Index: kernel/ideals.cc
===================================================================
--- kernel/ideals.cc	(revision 232b0953a6412f9a34b3e57519d0c19ff4cfb73c)
+++ kernel/ideals.cc	(revision 2bcf4bf587e11f75f4c6a2263c9c96038f75b0e8)
@@ -236,6 +236,7 @@
 
   ring orig_ring=currRing;
-  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE); rChangeCurrRing(syz_ring);
-  rSetSyzComp(length, syz_ring);
+  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
+  rSetSyzComp(length,syz_ring);
+  rChangeCurrRing(syz_ring);
 
   while ((j>0) && (first->m[j-1]==NULL)) j--;
@@ -375,6 +376,7 @@
 
   ring orig_ring=currRing;
-  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE); rChangeCurrRing(syz_ring);
-  rSetSyzComp(syzComp, syz_ring);
+  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
+  rSetSyzComp(syzComp,syz_ring);
+  rChangeCurrRing(syz_ring);
 
   bigmat = idInit(j,(k+1)*maxrk);
@@ -558,8 +560,7 @@
   assume(currRing != NULL);
   ring orig_ring=currRing;
-  ring syz_ring=rAssure_SyzComp(orig_ring,TRUE); rChangeCurrRing(syz_ring);
-
-  if (setSyzComp)
-    rSetSyzComp(k,syz_ring);
+  ring syz_ring=rAssure_SyzComp(orig_ring,TRUE);
+  if (setSyzComp) rSetSyzComp(k,syz_ring);
+  rChangeCurrRing(syz_ring);
 
   if (orig_ring != syz_ring)
@@ -683,7 +684,7 @@
   assume(currRing != NULL);
   ring orig_ring=currRing;
-  ring syz_ring=rAssure_SyzComp(orig_ring,TRUE); rChangeCurrRing(syz_ring);
-
+  ring syz_ring=rAssure_SyzComp(orig_ring,TRUE);
   rSetSyzComp(k,syz_ring);
+  rChangeCurrRing(syz_ring);
 
   if (orig_ring != syz_ring)
@@ -751,6 +752,7 @@
 
   ring orig_ring = currRing;
-  ring syz_ring = rAssure_SyzOrder(orig_ring,TRUE);  rChangeCurrRing(syz_ring);
+  ring syz_ring = rAssure_SyzOrder(orig_ring,TRUE);
   rSetSyzComp(k,syz_ring);
+  rChangeCurrRing(syz_ring);
 
   ideal s_h1=h1;
@@ -947,6 +949,7 @@
 
   ring orig_ring=currRing;
-  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);  rChangeCurrRing(syz_ring);
+  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
   rSetSyzComp(k,syz_ring);
+  rChangeCurrRing(syz_ring);
 
   ideal s_mod, s_temp;
@@ -1306,6 +1309,7 @@
 
   ring orig_ring=currRing;
-  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);  rChangeCurrRing(syz_ring);
+  ring syz_ring=rAssure_SyzOrder(orig_ring,TRUE);
   rSetSyzComp(kmax-1,syz_ring);
+  rChangeCurrRing(syz_ring);
   if (orig_ring!=syz_ring)
   //  s_h4 = idrMoveR_NoSort(s_h4,orig_ring, syz_ring);
@@ -2081,5 +2085,7 @@
 
   ring orig_ring=currRing;
-  ring syz_ring=rAssure_SyzOrder(orig_ring, TRUE); rChangeCurrRing(syz_ring);
+  ring syz_ring=rAssure_SyzOrder(orig_ring, TRUE);
+  rSetSyzComp(length,syz_ring);
+  rChangeCurrRing(syz_ring);
   // we can use OPT_RETURN_SB only, if syz_ring==orig_ring,
   // therefore we disable OPT_RETURN_SB for modulo:
@@ -2088,5 +2094,5 @@
   //  rSetSyzComp(IDELEMS(h2)+length, syz_ring);
   //else
-    rSetSyzComp(length, syz_ring);
+  //  rSetSyzComp(length, syz_ring);
   ideal s_temp;
 
@@ -2620,5 +2626,5 @@
 }
 
-GbVariant syGetAlgorithm(char *n, const ring r, const ideal M)
+GbVariant syGetAlgorithm(char *n, const ring r, const ideal /*M*/)
 {
   GbVariant alg=GbDefault;
Index: libpolys/polys/monomials/ring.cc
===================================================================
--- libpolys/polys/monomials/ring.cc	(revision 232b0953a6412f9a34b3e57519d0c19ff4cfb73c)
+++ libpolys/polys/monomials/ring.cc	(revision 2bcf4bf587e11f75f4c6a2263c9c96038f75b0e8)
@@ -2346,5 +2346,8 @@
   ord_struct.data.syz.place=place;
   ord_struct.data.syz.limit=syz_comp;
-  ord_struct.data.syz.syz_index = (int*) omAlloc0((syz_comp+1)*sizeof(int));
+  if (syz_comp>0)
+    ord_struct.data.syz.syz_index = (int*) omAlloc0((syz_comp+1)*sizeof(int));
+  else
+    ord_struct.data.syz.syz_index = NULL;
   ord_struct.data.syz.curr_index = 1;
   o[place]= -1;
@@ -4996,4 +4999,5 @@
   if ((r->typ!=NULL) && (r->typ[0].ord_typ==ro_syz))
   {
+    r->block0[0]=r->block1[0] = k;
     if( k == r->typ[0].data.syz.limit )
       return; // nothing to do
@@ -5040,6 +5044,9 @@
 #endif
   }
-  else
-  if ((r->order[0]!=ringorder_c) && (k!=0)) // ???
+  else if (r->order[0]==ringorder_s)
+  {
+    r->block0[0] = r->block1[0] = k;
+  }
+  else if (r->order[0]!=ringorder_c)
   {
     dReportError("syzcomp in incompatible ring");
