diff --git a/doc/props/P_MATERIAL b/doc/props/P_MATERIAL
index 5be1bef..4ea4032 100644
--- a/doc/props/P_MATERIAL
+++ b/doc/props/P_MATERIAL
@@ -1,79 +1,99 @@
+
 P_MATERIAL
-NAME:
-     P_MATERIAL					"material"
+**********
 
-DEFINIERT IN:
-     <thing/material.h>
 
-BESCHREIBUNG:
-     Mapping mit prozentualen Anteilen von Materialien, aus denen ein Objekt 
-     besteht.
+NAME
+====
 
-BEMERKUNGEN:
-     Bei SetProp kann man zu Vereinfachung auch ein einzelnes Material oder 
-     ein Array aus Materialien angeben. Die Anteile werden dann 
-     gleichmaessig verteilt.
+   P_MATERIAL                                 "material"
 
-BEISPIELE:
-     // 100% Eis
-     SetProp(P_MATERIAL, MAT_ICE);
-     // QueryProp(P_MATERIAL) -> ([MAT_ICE:100])
 
-     // 50% Eis, 50% Misc-Holz
-     SetProp(P_MATERIAL, ({ MAT_ICE, MAT_MISC_WOOD }));
-     // QueryProp(P_MATERIAL) -> ([MAT_ICE:50, MAT_MISC_WOOD: 50])
+DEFINIERT IN
+============
 
-     // 60% Eis, 40% Misc-Holz
-     SetProp(P_MATERIAL, ([ MAT_ICE: 60, MAT_MISC_WOOD: 40 ]));
+   <thing/material.h>
 
-     // 100% Papier
-     SetProp(P_MATERIAL, MAT_PAPER);
-     // QueryProp(P_MATERIAL) -> ([MAT_PAPER:100])
 
-     // 50% Silber, 50% Gold
-     SetProp(P_MATERIAL, ({MAT_SILVER, MAT_GOLD}))
-     // QueryProp(P_MATERIAL) -> ([MAT_SILVER:50,MAT_GOLD:50])
+BESCHREIBUNG
+============
 
-     // ein weiser Schmied, der was daraus macht:
-     int i;
-     string *mat, mname, mgroup;
-     mat=m_indices(ob->QueryProp(P_MATERIAL));
-     i=sizeof(mat);
+   Mapping mit prozentualen Anteilen von Materialien, aus denen ein Objekt
+   besteht.
 
-     write("Der Schmied sagt: "+ob->Name(WER)+" besteht aus ...\n");
-     while(i--) {
-      // den Namen erkennen/aussprechen:
-      // Materialien werden allgemein ganz schlecht erkannt (zu 5%), aber
-      // alles aus Metall wird zu +100% gut erkannt ...
-      mname=MATERIALDB->MaterialName(mat[i], WER,
-	     ({5, ([MATERIAL_SYMMETRIC_RECOGNIZABILITY:
-			({MATGROUP_METAL, 100})])}));
 
-      // und nur Metalle analysieren ...
-      if(MATERIALDB->MaterialGroup(([mat[i]:100]),MATGROUP_METAL)>=100) {
-       int j;
-       string *mgr;
-       mgr=MATERIALDB->GetMatMembership(mat[i]);
-       j=sizeof(mgr);
-       mgroup=" gehoert zu ";
-       while(j--) {
-        mgroup+=MATERIALDB->GroupName(mgr[j]);
-        if(j>0) mgroup+=", ";
-       }
-      } else mgroup=" kenne ich nicht";
-      printf("%-12.12s: %s\n",mname, mgroup);
+BEMERKUNGEN
+===========
+
+   Bei SetProp kann man zu Vereinfachung auch ein einzelnes Material oder
+   ein Array aus Materialien angeben. Die Anteile werden dann
+   gleichmaessig verteilt.
+
+
+BEISPIELE
+=========
+
+   // 100% Eis
+   SetProp(P_MATERIAL, MAT_ICE);
+   // QueryProp(P_MATERIAL) -> ([MAT_ICE:100])
+
+   // 50% Eis, 50% Misc-Holz
+   SetProp(P_MATERIAL, ({ MAT_ICE, MAT_MISC_WOOD }));
+   // QueryProp(P_MATERIAL) -> ([MAT_ICE:50, MAT_MISC_WOOD: 50])
+
+   // 60% Eis, 40% Misc-Holz
+   SetProp(P_MATERIAL, ([ MAT_ICE: 60, MAT_MISC_WOOD: 40 ]));
+
+   // 100% Papier
+   SetProp(P_MATERIAL, MAT_PAPER);
+   // QueryProp(P_MATERIAL) -> ([MAT_PAPER:100])
+
+   // 50% Silber, 50% Gold
+   SetProp(P_MATERIAL, ({MAT_SILVER, MAT_GOLD}))
+   // QueryProp(P_MATERIAL) -> ([MAT_SILVER:50,MAT_GOLD:50])
+
+   // ein weiser Schmied, der was daraus macht:
+   int i;
+   string *mat, mname, mgroup;
+   mat=m_indices(ob->QueryProp(P_MATERIAL));
+   i=sizeof(mat);
+
+   write("Der Schmied sagt: "+ob->Name(WER)+" besteht aus ...\n");
+   while(i--) {
+    // den Namen erkennen/aussprechen:
+    // Materialien werden allgemein ganz schlecht erkannt (zu 5%), aber
+    // alles aus Metall wird zu +100% gut erkannt ...
+    mname=MATERIALDB->MaterialName(mat[i], WER,
+           ({5, ([MATERIAL_SYMMETRIC_RECOGNIZABILITY:
+                      ({MATGROUP_METAL, 100})])}));
+
+    // und nur Metalle analysieren ...
+    if(MATERIALDB->MaterialGroup(([mat[i]:100]),MATGROUP_METAL)>=100) {
+     int j;
+     string *mgr;
+     mgr=MATERIALDB->GetMatMembership(mat[i]);
+     j=sizeof(mgr);
+     mgroup=" gehoert zu ";
+     while(j--) {
+      mgroup+=MATERIALDB->GroupName(mgr[j]);
+      if(j>0) mgroup+=", ";
      }
+    } else mgroup=" kenne ich nicht";
+    printf("%-12.12s: %s\n",mname, mgroup);
+   }
 
 
-SIEHE AUCH:
-     Konzepte:	  material, materialerkennung
-     Grundlegend: /sys/thing/material.h
-     Methoden:    QueryMaterial(), QueryMaterialGroup(), MaterialList(),
-     Listen:	  AllMaterials(), AllGroups(), Dump()
-		  materialliste, materialgruppen
-     Master:	  AddMaterial(), ConvMaterialList(), MaterialGroup(),
-		  GroupName(), MaterialName(),
-		  GetGroupMembers(), GetMatMembership()
-     Sonstiges:	  P_MATERIAL_KNOWLEDGE
+SIEHE AUCH
+==========
 
-7. Mai 2004 Gloinson
\ No newline at end of file
+   Konzepte:    material, materialerkennung
+   Grundlegend: /sys/thing/material.h
+   Methoden:    QueryMaterial(), QueryMaterialGroup(), MaterialList(),
+   Listen:      AllMaterials(), AllGroups(), Dump()
+                materialliste, materialgruppen
+   Master:      AddMaterial(), ConvMaterialList(), MaterialGroup(),
+                GroupName(), MaterialName(),
+                GetGroupMembers(), GetMatMembership()
+   Sonstiges:   P_MATERIAL_KNOWLEDGE
+
+7. Mai 2004 Gloinson
