diff --git a/std/thing/language.c b/std/thing/language.c
new file mode 100644
index 0000000..4a3d6f9
--- /dev/null
+++ b/std/thing/language.c
@@ -0,0 +1,199 @@
+// MorgenGrauen MUDlib
+//
+// thing/language.c -- language handling object
+//
+// $Id: language.c 8359 2013-02-09 11:43:39Z Zesstra $
+
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <thing/language.h>
+#include <thing/description.h>
+
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+
+// Kein create()
+void create()
+{
+  return;
+}
+
+//Inversion, damit Defaultwert von 0 einen Artikel ausgibt
+static int _query_article() { return !Query(P_ARTICLE); }
+
+static int _set_article(int art) { return !Set(P_ARTICLE,!art); }
+
+// Bestimmten Artikel bestimmen
+private string query_c_article(int casus)
+{
+  if (QueryProp(P_PLURAL))
+    return ({ "die ", "der ", "den ", "die "})[casus];
+
+  return ({ ({ "das ", "des ", "dem ", "das " }),
+            ({ "der ", "des ", "dem ", "den " }),
+            ({ "die ", "der ", "der ", "die " }) })
+    [(int)QueryProp(P_GENDER)][casus];
+}
+
+// Ende fuer Artikel und Adjektive
+private varargs string query_g_suffix(int gen, int casus, int anzahl)
+{
+  return ({ ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({  "","e"}) }),
+	    ({ ({ "","e"}), ({"es","er"}), ({"em","en"}), ({"en","e"}) }),
+	    ({ ({"e","e"}), ({"er","er"}), ({"er","en"}), ({ "e","e"}) }) })
+    [gen][casus][anzahl];
+}
+
+// Artikel vorschlagen: gibt es noch mehr Objekte im inv?
+varargs int SuggestArticle(string id)
+{
+  object ob,*obs;
+
+  // Raum oder Master: Bestimmt.
+  if (!environment()) return 1;
+
+  // Keine id? Dann raus
+  if (!id) return 1;
+
+  // Objekt mit gleichem Namen im env? Dann unbestimmt
+  for ( ob=first_inventory(environment()) ; ob ; ob=next_inventory(ob) )
+    if ( ob!=this_object()&& id==(string)ob->QueryProp(P_NAME) )
+      return 0;
+
+  // sonst bestimmt
+  return 1;
+}
+
+// Artikel bestimmen
+varargs string QueryArticle(int casus, int dem, int force)
+{
+  // Kein Artikel
+  if (!force &&!(QueryProp(P_ARTICLE))) return "";
+
+  // Artikelart aussuchen
+  if ( dem==2 ) dem = SuggestArticle(QueryProp(P_NAME));
+
+  // Bestimmter Artikel
+  if (dem) return query_c_article(casus);
+
+  // Unbestimmter Artikel
+  if (QueryProp(P_PLURAL)) return "";
+  
+  return sprintf("ein%s ",query_g_suffix((int)QueryProp(P_GENDER),casus));
+}
+
+// Besitzanzeiger fuer Objekt bestimmen
+varargs string QueryOwn(int casus)
+{
+  return sprintf("Dein%s",query_g_suffix(QueryProp(P_GENDER),casus));
+}
+
+// Possessivpronomen bestimmen
+varargs string QueryPossPronoun(mixed what, int casus, int number)
+{
+  int gen2;
+
+  // Geschlecht ermitteln
+  gen2 = (objectp(what)?(int)what->QueryProp(P_GENDER):(int)what);
+
+  // Plural ist schoen einfach
+  if (QueryProp(P_PLURAL)) return "ihr"+query_g_suffix(gen2, casus, number);
+
+  return (((((int)QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
+          query_g_suffix(gen2%3, casus, number));
+}
+
+// Pronomen bestimmen nach KNG
+varargs string QueryPronoun(int casus)
+{
+  int gender;
+
+  // Plural ist immer einfach ...
+  if (QueryProp(P_PLURAL)) 
+  {
+     if (casus==WEM) return "ihnen";
+     return "sie";
+  }
+
+  switch(QueryProp(P_GENDER))
+  {
+    case FEMALE:
+      if (casus==WESSEN) return "ihrer";
+      if (casus==WEM) return "ihr";
+      return "sie";
+
+    case MALE:
+      if (casus==WER) return "er";
+      if (casus==WESSEN) return "seiner";
+      if (casus==WEM) return "ihm";
+      return "ihn";
+  }    
+  if (casus==WESSEN) return "seiner";
+  if (casus==WEM) return "ihm";
+  return "es"; //fall-through
+}
+
+// Anrede fuer Spieler bestimmen
+varargs string QueryDu(int casus,int gender,int zahl)
+{
+  return
+    ({ ({({    "du",   "ihr"}),({    "du",   "ihr"}),({    "du",   "ihr"})}),
+       ({({"deiner",  "euer"}),({"deiner",  "euer"}),({"deiner",  "euer"})}),
+       ({({   "dir",  "euch"}),({   "dir",  "euch"}),({   "dir",  "euch"})}),
+       ({({  "dich",  "euch"}),({  "dich",  "euch"}),({  "dich",  "euch"})})
+     })[casus][gender][zahl];
+}
+
+// Welches Geschlecht hat das Objekt als String?
+string QueryGenderString()
+{
+  switch( (int)QueryProp( P_GENDER ))
+  {
+    case MALE:   return "maennlich";
+    case FEMALE: return "weiblich";
+  }
+  return("saechlich"); //fall-through
+}
+
+// Artikel durchdeklinieren nach Kasus, Numerus, Genus und Art
+// des Artikels (demon==bestimmt)
+varargs string DeclAdj(mixed adj, int casus, int demon)
+{
+	// Unregelmaessige Adjektive
+	if( pointerp(adj) ) return adj[casus]+" ";
+
+  // Falscher Typ? Und Tschuess ...
+  if (!stringp(adj)) return "";
+
+  // Plural ist einfach
+  if (QueryProp(P_PLURAL))
+  {
+    // Bestimmt
+    if (demon) return adj+"en ";
+
+    // Unbestimmt
+    return adj + ({ "e ", "er ", "en ", "e " })[casus];
+  }
+  
+  if ( demon )
+    return adj + ({ ({ "e " , "en ", "en ", "e "  }),
+		    ({ "e " , "en ", "en ", "en " }),
+		    ({ "e " , "en ", "en ", "e "  }) })
+      [(int)QueryProp( P_GENDER )][casus];
+  else
+    return adj + ({ ({ "es ", "en ", "en ", "es " }),
+		    ({ "er ", "en ", "en ", "en " }),
+		    ({ "e " , "en ", "en ", "e "  }) })
+      [(int)QueryProp( P_GENDER )][casus];
+}
+
+// P_GENDER setzen. Es sind nur 0,1 und 2 (MALE,FEMALE,NEUTER) erlaubt
+static int _set_gender(int i)
+{
+  if (i>-1&&i<3) return Set(P_GENDER,i);
+  return Query(P_GENDER);
+}
