Index: Singular/iparith.cc
===================================================================
--- Singular/iparith.cc	(revision 2e4ee2b73c0c10b254963f2c5bb24ce6688d1f5b)
+++ Singular/iparith.cc	(revision 12f6ce0e6bfb8dc07844936aaca9a865a3593bf3)
@@ -33,5 +33,5 @@
 #include <Singular/mod_lib.h>
 #include <polys/weight.h>
-
+#include <polys/ext_fields/transext.h>
 
 #include <kernel/stairc.h>
@@ -4366,4 +4366,16 @@
   }
   res->data = (char *)i;
+  return FALSE;
+}
+static BOOLEAN jjDIFF_COEF(leftv res, leftv u, leftv v)
+{
+  if (currRing->cf->type!=n_transExt) 
+  { 
+    WerrorS("differentiation not defined in the coefficient ring");
+    return TRUE;
+  }
+  number n = (number) u->Data();
+  number k = (number) v->Data();
+  res->data = ntDiff(n,k,currRing->cf);
   return FALSE;
 }
Index: Singular/table.h
===================================================================
--- Singular/table.h	(revision 2e4ee2b73c0c10b254963f2c5bb24ce6688d1f5b)
+++ Singular/table.h	(revision 12f6ce0e6bfb8dc07844936aaca9a865a3593bf3)
@@ -522,4 +522,5 @@
 ,{D(jjDIFF_ID),   DIFF_CMD,       MODUL_CMD,      MODUL_CMD,  POLY_CMD, ALLOW_PLURAL |ALLOW_RING}
 ,{D(jjDIFF_ID),   DIFF_CMD,       MATRIX_CMD,     MATRIX_CMD, POLY_CMD, ALLOW_PLURAL |ALLOW_RING}
+,{D(jjDIFF_COEF), DIFF_CMD,       NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD, ALLOW_PLURAL |ALLOW_RING}
 ,{D(jjDIM2),      DIM_CMD,        INT_CMD,        IDEAL_CMD,  IDEAL_CMD, ALLOW_PLURAL |NO_RING}
 ,{D(jjDIM2),      DIM_CMD,        INT_CMD,        MODUL_CMD,  IDEAL_CMD, ALLOW_PLURAL |NO_RING}
Index: libpolys/polys/ext_fields/transext.cc
===================================================================
--- libpolys/polys/ext_fields/transext.cc	(revision 2e4ee2b73c0c10b254963f2c5bb24ce6688d1f5b)
+++ libpolys/polys/ext_fields/transext.cc	(revision 12f6ce0e6bfb8dc07844936aaca9a865a3593bf3)
@@ -33,4 +33,9 @@
 *           TODO: the description above needs a major update!!!
 */
+
+
+
+
+
 #define TRANSEXT_PRIVATES
 
@@ -67,4 +72,5 @@
 #define ADD_COMPLEXITY 1   /**< complexity increase due to + and - */
 #define MULT_COMPLEXITY 2   /**< complexity increase due to * and / */
+#define DIFF_COMPLEXITY 2   /**< complexity increase due to * and / */
 #define BOUND_COMPLEXITY 10   /**< maximum complexity of a number */
 
@@ -740,4 +746,52 @@
 */
 }
+
+number ntDiff(number a, number d, const coeffs cf)
+{
+  ntTest(a);
+  ntTest(d);
+
+  fraction t = (fraction) d;
+  if (!DENIS1(t))
+  {
+    WerrorS("expected differentiation by a variable");
+    return a;
+  }
+  int k=p_Var(NUM(t),ntRing);
+  if (k==0)
+  {
+    WerrorS("expected differentiation by a variable");
+    return a;
+  }
+
+  if (IS0(a)) return ntCopy(a, cf);
+
+  fraction fa = (fraction)a;
+
+  poly g = p_Copy(NUM(fa), ntRing);
+  poly f = p_Copy(DEN(fa), ntRing);
+  poly dg =p_Diff(g,k,ntRing);
+
+  if (DENIS1(fa)) {
+
+     fraction result = (fraction)omAlloc0Bin(fractionObjectBin);
+     NUM(result) = dg;
+     DEN(result) = NULL;
+     COM(result) = COM(fa);
+     return (number)result;
+  }
+
+  poly df =p_Diff(f,k,ntRing);
+  fraction result = (fraction)omAlloc0Bin(fractionObjectBin);
+  poly fg = p_Mult_q(p_Copy(f,ntRing),dg,ntRing);
+  poly gf = p_Neg(p_Mult_q(g,df,ntRing),ntRing);
+  NUM(result) = p_Add_q(fg,gf,ntRing);
+  DEN(result) = p_Mult_q(p_Copy(f,ntRing), f, ntRing);
+  COM(result) = COM(fa) + COM(fa) + DIFF_COMPLEXITY;
+  heuristicGcdCancellation((number)result, cf);
+
+  return (number)result;
+}
+
 
 number ntAdd(number a, number b, const coeffs cf)
Index: libpolys/polys/ext_fields/transext.h
===================================================================
--- libpolys/polys/ext_fields/transext.h	(revision 2e4ee2b73c0c10b254963f2c5bb24ce6688d1f5b)
+++ libpolys/polys/ext_fields/transext.h	(revision 12f6ce0e6bfb8dc07844936aaca9a865a3593bf3)
@@ -98,4 +98,6 @@
 BOOLEAN  ntInitChar(coeffs cf, void* infoStruct);
 
+number ntDiff(number a, number d, const coeffs cf);
+
 /* Private hidden interface
 BOOLEAN  ntGreaterZero(number a, const coeffs cf); 
