diff --git a/std/thing/description.c b/std/thing/description.c
index afbb16e..fb8e3d1 100644
--- a/std/thing/description.c
+++ b/std/thing/description.c
@@ -120,7 +120,7 @@
 
 // Manche Objekte koennen mit rename_object einen neuen Filenamen bekommen.
 // Danach sollte der EPMASTER neu nach den Details befragt werden.
-void __reload_explore()
+visible void __reload_explore()
 {
   explore = (mixed *)EPMASTER->QueryExplore();
   return;
@@ -138,7 +138,7 @@
 
 /* Ids muessen uebergeben werden, da unit machmal mit plural-Ids, */
 /* also anderen als den normalen arbeiten muss. */
-int match_item( string str, string *ids )
+visible int match_item( string str, string *ids )
 {
   string *obj,*ads;
   int len, i;
@@ -169,7 +169,7 @@
 // Wird vom Gamedriver aufgerufen (present)
 // Hat dieser Gegenstand die ID str?
 // lvl wird ignoriert
-varargs int id( string str, int lvl ) 
+public varargs int id( string str, int lvl )
 { 
   string str2, tmp;
   int count;	
@@ -199,7 +199,7 @@
 }
 
 // Gleich eine ganze Liste von ids testen
-int match_ids(string *list)
+public int match_ids(string *list)
 {
   string *ids;
 
@@ -214,7 +214,7 @@
 }
 
 // ID hinzufuegen
-void AddId( string|string* str )
+public void AddId( string|string* str )
 {
   if (stringp(str)) str = ({ str });
   if (pointerp(str))
@@ -224,7 +224,7 @@
 }
 
 // ID entfernen
-void RemoveId(string|string* str)
+public void RemoveId(string|string* str)
 {
   if (stringp(str)) str = ({ str });
   if (pointerp(str))
@@ -241,7 +241,7 @@
 }
 
 // Adjektiv hinzufuegen
-void AddAdjective(string|string* str)
+public void AddAdjective(string|string* str)
 {
   if (stringp(str)) str = ({ str });
   if (pointerp(str))
@@ -251,7 +251,7 @@
 }
 
 // Adjektiv entfernen
-void RemoveAdjective(string|string* str)
+public void RemoveAdjective(string|string* str)
 {
   if (stringp(str)) str = ({ str });
   if (pointerp(str))
@@ -290,7 +290,7 @@
 }
 
 // Wie lautet der Name des Objekts?
-varargs string name(int casus,int demon)
+public varargs string name(int casus,int demon)
 {
   mixed sh, adj;
   int art, plural;
@@ -419,7 +419,7 @@
 }
 
 // Grossgeschriebenen Namen zurueckgeben
-varargs string Name( int casus, int demon )
+public varargs string Name( int casus, int demon )
 {
     return capitalize(name( casus, demon )||"");
 }
@@ -497,7 +497,7 @@
 }
 
 // Detail(s) hinzufuegen
-void AddDetail(string|string* keys, string|string*|mapping|closure descr)
+public void AddDetail(string|string* keys, string|string*|mapping|closure descr)
 {
     int i;
     mapping details;
@@ -509,7 +509,7 @@
 }
 
 // Detail(s) entfernen
-varargs void RemoveDetail(string|string* keys )
+public varargs void RemoveDetail(string|string* keys )
 {
   // Alle loeschen geht direkt ...
   if (!keys )
@@ -520,7 +520,7 @@
 }
 
 // SpecialDetail hinzufuegen
-void AddSpecialDetail(string|string* keys, string functionname )
+visible void AddSpecialDetail(string|string* keys, string functionname )
 {
     closure cl;
 
@@ -542,7 +542,7 @@
 }
 
 // SpecialDetail(s) entfernen
-void RemoveSpecialDetail(string|string* keys )
+visible void RemoveSpecialDetail(string|string* keys )
 {
   // RemoveSpecialDetail(0) wuerde sonst ALLE Details (auch die
   // 'normalen') loeschen
@@ -552,7 +552,7 @@
 }
 
 // Lesbares Detail einfuegen
-void AddReadDetail(string|string* keys,
+public void AddReadDetail(string|string* keys,
                    string|string*|mapping|closure descr )
 {
   // _add_details() aendern das Mapping direkt, Set etc. nicht noetig.
@@ -560,7 +560,7 @@
 }
 
 // Lesbare(s) Detail(s) entfernen
-varargs void RemoveReadDetail(string|string* keys )
+public varargs void RemoveReadDetail(string|string* keys )
 {
   // Alle loeschen geht direkt ...
   if (!keys )
@@ -571,7 +571,7 @@
 }
 
 // Geraeusch(e) dazufuegen
-void AddSounds(string|string* keys,
+public void AddSounds(string|string* keys,
                string|string*|mapping|closure descr )
 {
   // _add_details() aendern das Mapping direkt, Set etc. nicht noetig.
@@ -579,7 +579,7 @@
 }
 
 // Geraeusch(e) entfernen
-varargs void RemoveSounds(string|string* keys )
+public varargs void RemoveSounds(string|string* keys )
 {
   // Alle loeschen geht direkt ...
   if (!keys )
@@ -590,7 +590,7 @@
 }
 
 // Geru(e)ch(e) hinzufuegen
-void AddSmells(string|string* keys,
+public void AddSmells(string|string* keys,
                string|string*|mapping|closure descr )
 {
   // _add_details() aendern das Mapping direkt, Set etc. nicht noetig.
@@ -598,7 +598,7 @@
 }
 
 // Geru(e)ch(e) entfernen
-varargs void RemoveSmells(string|string* keys )
+public varargs void RemoveSmells(string|string* keys )
 {
   // Alle loeschen geht direkt ...
   if (!keys )
@@ -609,7 +609,7 @@
 }
 
 // Tastbare(s) Detail(s) hinzufuegen
-void AddTouchDetail(string|string* keys,
+public void AddTouchDetail(string|string* keys,
                     string|string*|mapping|closure descr )
 {
   // _add_details() aendern das Mapping direkt, Set etc. nicht noetig.
@@ -617,7 +617,7 @@
 }
 
 // Tastbare(s) Detail(s) entfernen
-varargs void RemoveTouchDetails(string|string* keys )
+public varargs void RemoveTouchDetails(string|string* keys )
 {
   // Alle loeschen geht direkt ...
   if (!keys )
@@ -629,7 +629,7 @@
 
 // Detailinfos fuer Detail key, Spieler hat die Rasse race
 // und benutzt seinen Sinn sense
-varargs string GetDetail(string key, string race, int sense)
+public varargs string GetDetail(string key, string race, int sense)
 {
   string|string*|mapping|closure detail;
   
@@ -732,7 +732,7 @@
 }
 
 // Klasse entfernen
-void RemoveClass(string|string* str)
+public void RemoveClass(string|string* str)
 {
  if (stringp(str)) 
       str = ({ str });
@@ -748,7 +748,7 @@
 }
 
 // Ist das Objekt Mitglied der Klasse str?
-int is_class_member(string|string* str)
+public int is_class_member(string|string* str)
 {
   // Keine Klasse, keine Mitgliedschaft ...
   if (!str || str=="") 
@@ -821,7 +821,7 @@
 }
 
 // Anteil von mat am Objekt?
-int QueryMaterial( string mat )
+public int QueryMaterial( string mat )
 {
   mapping mats;
   
@@ -832,14 +832,14 @@
 }
 
 // Anteil der Gruppe am Objekt
-int QueryMaterialGroup( string matgroup )
+public int QueryMaterialGroup( string matgroup )
 {
   return (int)call_other( MATERIALDB, "MaterialGroup",
                           QueryProp(P_MATERIAL), matgroup );
 }
 
 
-string MaterialList( int casus, mixed idinf )
+public string MaterialList( int casus, mixed idinf )
 {
   return (string)call_other( MATERIALDB, "ConvMaterialList",
                              QueryProp(P_MATERIAL), casus, idinf );
