diff --git a/std/weapon/description.c b/std/weapon/description.c
new file mode 100644
index 0000000..aad2938
--- /dev/null
+++ b/std/weapon/description.c
@@ -0,0 +1,108 @@
+// MorgenGrauen MUDlib
+//
+// weapon/description.c -- weapon description handling
+//
+// $Id: description.c 6475 2007-09-19 20:56:40Z Zesstra $
+
+#pragma strict_types
+#pragma save_types
+#pragma no_clone
+#pragma pedantic
+#pragma range_check
+
+//#define NEED_PROTOTYPES
+
+#include <thing/properties.h>
+#include <thing/description.h>
+#include <properties.h>
+#include <combat.h>
+#include <thing/material.h>
+
+inherit "/std/thing/description";
+
+void create()
+{
+  ::create();
+  SetProp(P_DAM_DESC,DFLT_DAM_DESC);
+}
+
+string dam_descr()
+{   string re;
+    mixed desc;
+    int max,dam,pos;
+
+    if (!QueryProp(P_NAME) || !QueryProp(P_DAMAGED) || !QueryProp(P_SHORT) ||
+        !(desc=QueryProp(P_DAM_DESC)) || (!stringp(desc) && !pointerp(desc)))
+        return "";
+    re = capitalize(name(WER,2))+" ";
+    max = QueryProp(P_WC)+(dam=QueryProp(P_DAMAGED));
+    // Bei reinen Parierwaffen den AC als max nehmen!
+    if (QueryProp(P_PARRY)==PARRY_ONLY)
+    {
+	    max=QueryProp(P_AC)+dam;
+    }
+    if (stringp(desc))
+        return (dam>(max/2))?(re+desc+".\n"):"";
+    pos = (sizeof(desc)*dam/max);
+    // Sonst koennen Parierwaffen, die Schrott sind, buggen
+    if (pos==sizeof(desc)) pos--;
+    if (stringp(desc[pos]))
+        return (re+desc[pos]+".\n");
+    return "";
+}
+
+string short()
+{   string s;
+
+    if (!(s=QueryProp(P_SHORT)))
+        return 0;
+    return s + (QueryProp(P_WIELDED)?" (gezueckt).\n":".\n");
+}
+
+varargs string long()
+{   
+    return (process_string(QueryProp(P_LONG)||"") + (dam_descr()||""));
+}
+
+mixed _query_size() {
+  mixed res, wt;
+  if (intp(res=Query(P_SIZE)) && (res>0))
+    return res;
+  wt=QueryProp(P_WEAPON_TYPE);
+  switch (wt) {
+    case WT_SWORD  : return 100;  // default: Langschwert
+    case WT_AXE    : return  80;
+    case WT_CLUB   : return  80;
+    case WT_SPEAR  : return 180;
+    case WT_KNIFE  : return  20;
+    case WT_WHIP   : return 200;
+    case WT_STAFF  : return 150;
+  }
+  return 10;  // alles andere
+}
+
+mapping _query_material() {
+  mixed res,wt;
+
+  if (mappingp(res=Query(P_MATERIAL)))
+    return res;
+  wt=QueryProp(P_WEAPON_TYPE);
+  switch(wt) {
+    case WT_SWORD:
+    return ([MAT_MISC_METAL:100]);
+    case WT_KNIFE:
+    return ([MAT_MISC_METAL:80,MAT_MISC_WOOD:20]);
+    case WT_AXE:
+    return ([MAT_MISC_METAL:50,MAT_MISC_WOOD:50]);
+    case WT_SPEAR:
+    return ([MAT_MISC_METAL:20,MAT_MISC_WOOD:80]);
+    case WT_STAFF:
+    case WT_CLUB:
+    return ([MAT_MISC_WOOD:100]);
+  }
+  return ([MAT_MISC_METAL:100]);
+}
+
+// P_BALANCED_WEAPON und P_TECHNIQUE sind mangels umgesetztem Konzept durch
+// EM-Beschluss fuer obsolet erklaert worden. Zesstra. 26.06.2007
+
