Index: factory/facFqBivar.cc
===================================================================
--- factory/facFqBivar.cc	(revision 773d281c087d1388ff04cd6c70faccb93fe0fc03)
+++ factory/facFqBivar.cc	(revision 617dbcd561feba2c98f750ce8bd841e28e8da4d4)
@@ -4259,5 +4259,6 @@
                                CanonicalForm& bufF, CFList& factors, int& l,
                                int& factorsFound, bool beenInThres, CFMatrix& M,
-                               CFArray& Pi, CFList& diophant
+                               CFArray& Pi, CFList& diophant, bool symmetric,
+                               const CanonicalForm& evaluation
                               )
 {
@@ -4329,7 +4330,7 @@
     while ((degree (F,y)/4)*i + 4 <= smallFactorDeg)
       i++;
-    while (i < 4)
-    {
-      dummy= tmin (degree (F,y)+1, (degree (F,y)/4)*(i+1)+4);
+    while (i < 5)
+    {
+      dummy= tmin (degree (F,y)+1, (degree (F,y)/4)*i+4);
       if (l < dummy)
       {
@@ -4337,9 +4338,46 @@
         henselLiftResume12 (F, factors, l, dummy, Pi, diophant, M);
         l= dummy;
+        if (i == 1 && degree (F)%4==0 && symmetric && factors.length() == 2 &&
+            LC (F,1).inCoeffDomain() &&
+           (degree (factors.getFirst(), 1) == degree (factors.getLast(),1)))
+        {
+          Variable x= Variable (1);
+          CanonicalForm g, h, gg, hh, multiplier1, multiplier2, check1, check2;
+          int m= degree (F)/4+1;
+          g= factors.getFirst();
+          h= factors.getLast();
+          g= mod (g, power (y,m));
+          h= mod (h, power (y,m));
+          g= g (y-evaluation, y);
+          h= h (y-evaluation, y);
+          gg= mod (swapvar (g,x,y),power (x,m));
+          gg= gg (y + evaluation, y);
+          multiplier1= factors.getLast()[m-1][0]/gg[m-1][0];
+          gg= div (gg, power (y,m));
+          gg= gg*power (y,m);
+          hh= mod (swapvar (h,x,y),power (x,m));
+          hh= hh (y + evaluation, y);
+          multiplier2= factors.getFirst()[m-1][0]/hh[m-1][0];
+          hh= div (hh, power (y,m));
+          hh= hh*power (y,m);
+          gg= multiplier1*gg+mod (factors.getLast(), power (y,m));
+          hh= multiplier2*hh+mod (factors.getFirst(), power (y,m));
+          check1= gg (y-evaluation,y);
+          check2= hh (y-evaluation,y);
+          check1= swapvar (check1, x, y);
+          if (check1/Lc (check1) == check2/Lc (check2))
+          {
+            result.append (gg);
+            result.append (hh);
+            delete [] liftPre;
+            delete [] factorsFoundIndex;
+            return result;
+          }
+        }
       }
       else
       {
         i++;
-        if (i < 4)
+        if (i < 5)
           continue;
       }
@@ -4435,7 +4473,7 @@
     while ((degree (F,y)/4)*i + 4 <= smallFactorDeg)
       i++;
-    while (i < 4)
-    {
-      dummy= tmin (degree (F,y)+1, (degree (F,y)/4)*(i+1)+4);
+    while (i < 5)
+    {
+      dummy= tmin (degree (F,y)+1, (degree (F,y)/4)*i+4);
       if (l < dummy)
       {
@@ -4447,5 +4485,5 @@
       {
         i++;
-        if (i < 4)
+        if (i < 5)
           continue;
       }
@@ -4546,7 +4584,7 @@
     while ((degree (F,y)/4)*i + 4 <= smallFactorDeg)
       i++;
-    while (i < 4)
-    {
-      dummy= tmin (degree (F,y)+1, (degree (F,y)/4)*(i+1)+4);
+    while (i < 5)
+    {
+      dummy= tmin (degree (F,y)+1, (degree (F,y)/4)*i+4);
       if (l < dummy)
       {
@@ -4558,5 +4596,5 @@
       {
         i++;
-        if (i < 4)
+        if (i < 5)
           continue;
       }
@@ -4675,5 +4713,6 @@
 CFList
 henselLiftAndLatticeRecombi (const CanonicalForm& G, const CFList& uniFactors,
-                             const Variable& alpha, const DegreePattern& degPat
+                             const Variable& alpha, const DegreePattern& degPat,
+                             bool symmetric, const CanonicalForm& evaluation
                             )
 {
@@ -5005,5 +5044,5 @@
     result= earlyReconstructionAndLifting (F, NTLN, bufF, bufUniFactors, l,
                                            factorsFound, beenInThres, M, Pi,
-                                           diophant
+                                           diophant, symmetric, evaluation
                                           );
 
@@ -5143,5 +5182,6 @@
     }
     return Union (result, henselLiftAndLatticeRecombi (bufF, bufUniFactors,
-                                                       alpha, degs
+                                                       alpha, degs, symmetric,
+                                                       evaluation
                                                       )
                  );
@@ -5273,5 +5313,5 @@
     delete [] bounds;
     return Union (result, henselLiftAndLatticeRecombi (F, bufUniFactors, alpha,
-                                                       degs
+                                                       degs,symmetric, evaluation
                                                       )
                  );
@@ -5933,5 +5973,5 @@
 
   bool fail= false;
-  CanonicalForm Aeval, evaluation, bufAeval, bufEvaluation, buf;
+  CanonicalForm Aeval, evaluation, bufAeval, bufEvaluation, buf, tmp;
   CFList uniFactors, list, bufUniFactors;
   DegreePattern degs;
@@ -5951,4 +5991,5 @@
   int subCheck1= substituteCheck (A, x);
   int subCheck2= substituteCheck (A, y);
+  bool symmetric= false;
   for (int i= 0; i < factorNums; i++)
   {
@@ -5957,5 +5998,9 @@
     if (!derivXZero && !fail2)
     {
-      buf= swapvar (A, x, y);
+      if (i == 0)
+      {
+        buf= swapvar (A, x, y);
+        symmetric= (A/Lc (A) == buf/Lc (buf));
+      }
       bufAeval2= buf;
       bufEvaluation2= evalPoint (buf, bufAeval2, alpha, list2, GF, fail2);
@@ -5970,5 +6015,7 @@
         subCheck2= subCheck1;
         subCheck1= dummy;
+        tmp= A;
         A= buf;
+        buf= tmp;
         bufAeval= bufAeval2;
         swap2= true;
@@ -6200,10 +6247,12 @@
     else if (alpha.level() == 1 && !GF)
     {
-      CFList lll= henselLiftAndLatticeRecombi (A, uniFactors, alpha, degs);
+      CFList lll= henselLiftAndLatticeRecombi (A, uniFactors, alpha, degs, 
+                                               symmetric, evaluation);
       factors= Union (lll, factors);
     }
     else if (!extension && (alpha != x || GF))
     {
-      CFList lll= henselLiftAndLatticeRecombi (A, uniFactors, alpha, degs);
+      CFList lll= henselLiftAndLatticeRecombi (A, uniFactors, alpha, degs,
+                                               symmetric, evaluation);
       factors= Union (lll, factors);
     }
