diff --git a/lib/modules/Calendar.pmod/Gregorian.pmod b/lib/modules/Calendar.pmod/Gregorian.pmod
index 3fbe43ea139c08fb3eb5c1cf0d3e7171d9b3eb51..0cab581a4f0dbf629c206f1b190bc4946ca98f9d 100644
--- a/lib/modules/Calendar.pmod/Gregorian.pmod
+++ b/lib/modules/Calendar.pmod/Gregorian.pmod
@@ -8,7 +8,7 @@
 //! class 
 
 array(string) month_names=
-   ({"January","February","March","April","May","June","July","August",
+   ({"January","February","Mars","April","May","June","July","August",
      "September","October","November","December"});
 
 array(string) week_day_names=
@@ -53,6 +53,11 @@ class Year
 
 //-- standard methods -----------------------------------------------
 
+   string is()
+   {
+      return "year";
+   }
+
    array(string) lesser() 
    { 
       return ({"month","week","day"});
@@ -282,6 +287,11 @@ class Month
 
 //-- standard methods -----------------------------------------------
 
+   string is()
+   {
+      return "month";
+   }
+
    array(string) lesser() 
    { 
       return ({"day"});
@@ -425,6 +435,11 @@ class Week
 
 //-- standard methods -----------------------------------------------
 
+   string is()
+   {
+      return "week";
+   }
+
    array(string) lesser() 
    { 
       return ({"day"});
@@ -592,6 +607,11 @@ class Day
 
 //-- standard methods -----------------------------------------------
 
+   string is()
+   {
+      return "day";
+   }
+
    array(string) greater()
    {
       return ({"year","month","week"});
@@ -602,7 +622,7 @@ class Day
       return ({"hour"});
    }
 
-   void create(int ... arg)
+   void create(int|object ... arg)
    {
       if (!sizeof(arg))
       {
@@ -610,6 +630,31 @@ class Day
 	 y=1900+t->year;
 	 d=t->yday;
       }
+      else if (sizeof(arg)==1)
+      {
+	 int jd;
+
+	 if (objectp(arg[0]))
+	    jd=(int)((arg[0]->julian_day||arg[0]->julian_day_f)());
+	 else
+	    jd=arg[0];
+
+	 object yo;
+	 y=(int)(jd/365.2425)-4712;
+	 yo=vYear(y);
+	 while (yo->julian_day(0)>jd) yo--;
+	 write("y="+yo->number()+" yd="+yo->julian_day(0)+" nod="+yo->number_of_days()+"\n");
+	 while (jd-yo->julian_day(0)>=yo->number_of_days())
+	 {
+	    yo++;
+	    write("y="+yo->number()+" yd="+yo->julian_day(0)+" nod="+yo->number_of_days()+"\n");
+
+	 }
+	 y=yo->number();
+	 write("y="+y+"\n");
+	 d=jd-vYear(y)->julian_day(0);
+	 write("d="+d+"\n");
+      }
       else
       {
 	 y=arg[0];
@@ -783,6 +828,11 @@ class Hour
 
 //-- standard methods -----------------------------------------------
 
+   string is()
+   {
+      return "hour";
+   }
+
    array(string) greater()
    {
       return ({"day"});
@@ -959,6 +1009,11 @@ class Minute
 
 //-- standard methods -----------------------------------------------
 
+   string is()
+   {
+      return "minute";
+   }
+
    array(string) greater()
    {
       return ({"hour"});
@@ -1152,6 +1207,11 @@ class Second
 
 //-- standarm setsoms -----------------------------------------------
 
+   string is()
+   {
+      return "second";
+   }
+
    array(string) greater()
    {
       return ({"minute","hour","day","month","year"});
@@ -1331,4 +1391,76 @@ class Second
   
 };
 
+//-- parse functions -----------------------------------------------
+
+//! method object parse(string fmt,string arg)
+//!	parse a date, create relevant object
+//!	fmt is in the format "abc%xdef..."
+//!	where abc and def is matched, and %x is
+//!	one of those time units:
+//!	%Y absolute year 
+//!	%y year (70-99 is 1970-1999, 0-69 is 2000-2069)
+//!	%M month (number, name or short name) (needs %y)
+//!	%W week (needs %y)
+//!	%D date (needs %y, %m)
+//!	%a day (needs %y)
+//!	%e weekday (needs %y, %w)
+//!	%h hour (needs %d, %D or %W)
+//!	%m minute (needs %h)
+//!	%s second (needs %s)
+
+object parse(string fmt,string arg)
+{
+   string nfmt;
+   nfmt=replace(fmt,
+		({"%Y","%y","%M","%W","%D","%a","%e","%h","%m","%s"}),
+		({"%s","%s","%s","%s","%s","%s","%s","%s","%s","%s"}));
+   array q=Array.map(replace(fmt,"%%","")/"%",
+		     lambda(string s){ return s[..0];})-({""});
+   array res=Array.map(array_sscanf(arg,nfmt),
+		       lambda(string s)
+		       {
+			  if (s[0]>='0' && s[0]<='9')
+			     return array_sscanf(s,"%d")[0];
+			  else
+			     return s;
+		       });
+
+   if (sizeof(res)<sizeof(q)) 
+      return 0; // parse error
+
+   mapping m=mkmapping(q,res);
+
+   if (m->Y) m->year=Year(m->Y);
+   else if (m->y) 
+   {
+      if (m->y<70) m->y+=2000;
+      else if (m->y<100) m->y+=1900;
+      m->year=Year(m->y);
+   }
+   else m->year=Year();
+
+   object low=m->year;
+
+   if (m->M)
+      m->month=low=m->year->month(m->M);
+   if (m->W) 
+      m->week=low=m->year->week(m->W);
+
+   if (m->D)
+      m->day=low=(m->month||Month())->day(m->D);
+   else if (m->a)
+      m->day=low=m->year->day(m->a);
+   else if (m->e)
+      m->day=low=(m->week||Week())->day(m->e);
+   
+   if (m->h)
+      low=m->hour=(m->day||Day())->hour(m->h);
+   if (m->m)
+      low=m->minute=(m->hour||Hour())->minute(m->m);
+   if (m->s)
+      low=m->second=(m->minute||Minute())->second(m->s);
+
+   return low;
+}
 
diff --git a/lib/modules/Calendar.pmod/Stardate.pmod b/lib/modules/Calendar.pmod/Stardate.pmod
new file mode 100644
index 0000000000000000000000000000000000000000..a91e964fca62279d71949e5522cb65a7fa45aa73
--- /dev/null
+++ b/lib/modules/Calendar.pmod/Stardate.pmod
@@ -0,0 +1,106 @@
+//! submodule Stardate
+//!	time unit: TNGDate
+
+//! class TNGDate
+//!	implements ST:TNG stardates
+//!	can be used as create argument to Day 
+
+class TNGDate
+{
+   inherit Calendar._TimeUnit;
+
+   // 40759.5  2363-10-05  2584405
+   // 47391.2  2370-05-23  2586827
+
+   // 50893.5  2373-11-23  2588107
+
+   //  6631.7  ----------  2422 
+   // 10134.0  ----------  3702
+   //  1000.0  ----------  365.2425
+   //     0.0      -  -    2569519
+#define TNGSTARPERJULIAN (1000.0/365.2425)
+
+//-- variables ------------------------------------------------------
+
+   float jd;
+   float tics;
+   
+//-- standard methods -----------------------------------------------
+
+   void create(int|float|object ... day)
+   {
+      float jd;
+      if (!sizeof(day))
+	 day=({Calendar.Gregorian.Second()});
+      else if (floatp(day[0]))
+      {
+	 from_stardate(day[0]);
+	 return;
+      }
+      if (!intp(day[0]))
+      {
+	 object o=day[0];
+
+	 if (o->julian_day || o->julian_day_f)
+	    jd=(float)(o->julian_day_f||o->julian_day)();
+	 else // dig
+	    if (o->day) // larger
+	    {
+	       o=o->day(0);
+	       if (o->julian_day_f)
+		  jd=o->julian_day_f();
+	       else if (o->julian_day)
+		  jd=(float)o->julian_day();
+	       else
+		  ; // error, like
+	    }
+	    else // smaller
+	    {
+	       float z=1.0;
+	       while (sizeof(o->greater()))
+	       {
+		  string name=o->is();
+		  o=o[o->greater()[0]]();
+		  z*=o["number_of_"+name+"s"]();
+		  if (o->julian_day_f || o->julian_day) 
+		  {
+		     jd=(o->julian_day||o->julian_day_f)()/z;
+		     break;
+		  }
+	       }
+	    }
+      }
+      else 
+	 jd=(float)day[0];
+      from_julian_day(jd);
+   }
+
+   static void from_stardate(float f)
+   {
+      tics=f;
+      jd=f/TNGSTARPERJULIAN+2569518.5;
+   }
+
+   static void from_julian_day(float f)
+   {
+      jd=f;
+      tics=(f-2569518.5)*TNGSTARPERJULIAN;
+   }
+
+//-- nonstandard methods --------------------------------------------
+
+   float number()
+   {
+      return tics;
+   }
+   
+   int julian_day()
+   {
+      return (int)jd;
+   }
+
+   float julian_day_f()
+   {
+      return jd;
+   }
+}