diff --git a/d/seher/haeuser/moebel/vitrine.c b/d/seher/haeuser/moebel/vitrine.c
new file mode 100644
index 0000000..ae5bb96
--- /dev/null
+++ b/d/seher/haeuser/moebel/vitrine.c
@@ -0,0 +1,339 @@
+/************************************************************************************
+Vitrine fuer die Pokale
+Autor: Miril
+letzte Aenderung:
+05.09.2011
+************************************************************************************/
+
+#include <properties.h>
+#include <defines.h>
+#include <wizlevels.h>
+#include "/d/ebene/miril/fraternitas/fraternitas.h"
+#include "/d/ebene/miril/fraternitas/trophy.h"
+#pragma strong_types,rtt_checks
+#include "/d/seher/haeuser/moebel/moebel.h"
+#include "/d/seher/haeuser/haus.h"
+
+inherit LADEN("swift_std_container");
+
+string besitzer;
+int staub;
+string *trophynamen;
+
+static string my_long();
+static string staub_descr();
+void GetTrophyDetails();
+string *GetAllTrophyNames();
+void NeueDetails();
+
+protected void create()
+{
+  if (!clonep(this_object())){
+    set_next_reset(-1);
+    return;
+  }
+  set_next_reset(86400);
+  ::create();
+  besitzer="";
+  staub=0;
+  SetProp(P_NAME,"Vitrine");
+  SetProp(P_SHORT,"Eine Vitrine");
+  Set(P_LONG,#'my_long,F_QUERY_METHOD);
+  SetProp(P_GENDER,FEMALE);
+  SetProp(P_MATERIAL,([MAT_GLASS:50,MAT_EBONY:50]));
+  SetProp(P_VALUE,10000);
+  SetProp(P_WEIGHT,500000);
+  SetProp(P_MAX_OBJECTS,0);
+  SetProp(P_MAX_WEIGHT,0);
+  SetProp(H_FURNITURE,1);
+  SetProp(P_NOGET,"Die Vitrine ist viel zu schwer.\n");
+  SetProp("cnt_version_obj",2);
+  GetTrophyDetails();
+  AddId(({"\nmiril_pokal_vitrine","vitrine"}));
+
+  NeueDetails();
+
+  AddCmd(({"saeubere","saeuber","reinige","reinig","mach","mache"}),
+           "saeuber_cmd");
+
+  AddCmd(({"stelle","stell"}),"stell_cmd");
+  RemoveCmd(({"serlaube"}));
+
+}
+
+void reset(){
+  ++staub;
+  set_next_reset(86400);
+  ::reset();
+  return;
+}
+
+void SetBesitzer(string uid,string uuid){
+  besitzer=uuid;
+  GetTrophyDetails();
+  return;
+}
+
+string QueryBesitzer(){
+  return besitzer;
+}
+
+void NeueDetails(){
+  AddDetail(({"holz","ebenholz"}),BS("Die Vitrine besteht teilweise "
+    "aus Ebenholz. Tueren, Deckel und Einlegeboeden sind aus Glas."));
+  AddDetail(({"tueren","tuer","glastueren","glastuer","deckel"}),BS(
+            "Durch das Glas kannst Du ins Innere der Vitrine gucken."));
+  AddDetail(({"inneres","gegenstaende","gegenstand"}),
+            BS("Dort kann man Pokale hineinstellen, aber nicht wieder "
+            "herausnehmen."));
+  AddDetail(({"glas","scheibe","scheiben"}),
+     BS("Glas ist praktisch, solange es sauber ist: "
+        "Man kann dadurch ins Innere schauen."));
+  AddDetail(({"reihe","platz","einlegeboeden","einlegeboden","boeden",
+              "boden"}),
+           BS("Die vielen Boeden bieten Platz fuer viele Pokale!"));
+  return;
+}
+
+
+static string my_long(){
+  if(staub<21)
+  return BS(
+  "Die schlichte Vitrine aus dunklem Holz eignet sich hervorragend, um "
+  "wertvolle Gegenstaende darin auszustellen. Hinter den beiden Glastueren "
+  "siehst Du eine Reihe von Einlegeboeden, die ebenfalls aus Glas bestehen. "+
+  staub_descr());
+  else return BS(staub_descr());
+}
+
+
+static string staub_descr(){
+  string text;
+  text="";
+  switch(staub){
+    case 0..1:
+      text=
+        "Die Vitrine ist hervorragend gepflegt. Du siehst keinerlei Staub "+
+        "darin, und die Scheiben sind voellig klar.\n";
+        AddDetail(({"staub"}),BS("Keiner zu sehen."));
+    break;
+    case 2..4:
+      text=
+        "Die Vitrine ist gut gepflegt. Es liegt kaum Staub darin, und die "+
+        "Tueren sind klar.\n";
+        AddDetail(({"staub"}),BS("Man sieht nur wenig davon."));
+    break;
+    case 5..7:
+      text=
+        "Die Vitrine ist in einem ordentlichen Zustand, allerdings sammelt "+
+        "sich so langsam Staub auf den Einlegeboeden.\n";
+        AddDetail(({"staub"}),BS("So langsam koennte man die "
+        "Vitrine saeubern!"));
+        AddDetail(({"zustand"}),BS("Noch ist er ordentlich."));
+    break;
+    case 8..10:
+      text=
+        "Die Vitrine wirkt schon etwas staubig. Man erkennt auch, dass "+
+        "der ein oder andere Fingerabdruck die Tueren ziert.";
+        AddDetail(({"staub","fingerabdruck","tueren","glastueren",
+        "deckel","glastuer","tuer","zustand"}),
+        BS("Es lohnt sich jetzt schon, die Vitrine zu saeubern."));
+    break;
+    case 11..15:
+      text=
+        "Du hast den Eindruck, dass die Vitrine langsam einmal gesaeubert "+
+        "werden koennte. Die Einlegeboeden sind staubig und zahlreiche "+
+        "Fingerabdruecke sind auf den Glastueren zu sehen.";
+    break;
+    case 16..20:
+      text=
+        "Die Vitrine macht einen recht ungepflegten Eindruck. Innen ist "+
+        "sie schon sehr verstaubt und auch die Tueren sind schon recht "+
+        "dreckig geworden.";
+        AddDetail(({"staub"}),BS("Nun wird es aber wirklich Zeit, die "
+        "Vitrine zu saeubern. Sonst sieht man bald nichts mehr darin."));
+    break;
+    case 21..25:
+      text=
+        "Die Vitrine ist total zugestaubt. Ueber den Glastueren sind "+
+        "erste Spinnweben zu erkennen und die Scheiben sind schon fast "+
+        "blind von all den Fingerabdruecken unaufmerksamer Gaeste.";
+         RemoveDetail(m_indices(QueryProp(P_DETAILS)));
+         AddDetail(({"spinnweben","dreck","vitrine","glastueren","glastuer",
+         "tueren","tuer","scheibe","scheiben","deckel"}),
+         "Unter dem ganzen Dreck ist leider nichts mehr zu erkennen.\n");
+         AddDetail(({"gaeste","gast","fingerabdruck","fingerabdruecke"}),
+         "Die Gaeste sind sicher schuld an dem Dreck.\n");
+    break;
+    case 26..30:
+      text=
+        "Du kannst die Vitrine unter der dicken Staubschicht kaum noch "+
+        "erkennen und die Glastueren sind blind geworden.";
+         AddDetail(({"staubschicht","schicht"}),
+         BS("Die ist verdammt dick und undurchsichtig."));
+    break;
+    default:
+      text=
+        "Dass sich unter dieser Ansammlung von Spinnweben und Staub noch "+
+        "eine Vitrine mit Glastueren verbergen soll, kannst Du kaum glauben. "+
+        "Jedenfalls kann man durch die voellig blinden Scheiben nichts "+
+        "mehr erkennen.";
+      AddDetail(({"dreck","spinnweben","staub","ansammlung"}),"Pfui Deibel!\n");
+  }
+  return text;
+}
+
+static int saeuber_cmd(string str){
+  string text;
+  if(!str) return 0;
+  if(strstr(str,"vitrine")<0) return 0;
+  switch(staub){
+    case 0:
+      write("Das ist noch nicht noetig!\n");
+      return 1;
+    break;
+    case 1..20:
+      text="Du reinigst die Vitrine gruendlich. Das wurde auch langsam "
+      "Zeit!";
+      if(getuuid(TP)!=besitzer)
+        text+="Du fragst Dich, wieso Du fremde Moebel reinigst.";
+
+      write(BS(text));
+      say(BS(TPN+" reinigt die Vitrine gruendlich. Das wurde auch langsam "
+      "Zeit!\n"),TP);
+      staub=0; //Hier darf noch jemand helfen!
+    break;
+    case 21..30:
+      text="Du beginnst die Vitrine zu reinigen. ";
+      if(getuuid(TP)!=besitzer){
+        text+="Nach einiger Zeit fragst Du Dich, ob Du eigentlich spinnst, "+
+        "denn das ist ueberhaupt nicht Deine Vitrine. Du laesst von dem "+
+        "Vorhaben wieder ab.";
+        say(BS(TPN+" faengt kurz an, die Vitrine zu reinigen, laesst es aber "
+        "schnell wieder sein."),TP);
+      }
+      else{
+        text+="Das dauert eine ganze Weile, aber dann strahlt die Vitrine "
+        "wieder.";
+        say(BS(TPN+" beginnt die Vitrine zu reinigen. Das dauert eine ganze "
+        "Weile, aber dann strahlt sie wieder."),TP);
+        staub=0;
+      }
+      write(BS(text));
+    break;
+    default:
+      if(getuuid(TP)!=besitzer)
+        write("Das dreckige Teil fasst Du nicht an!\n");
+      else{
+        write(BS(
+          "Du schrubbst und schrubbst und es scheint kein Ende zu nehmen. "
+          "Als Du schon langsam aufgeben willst, ist so langsam ein kleiner "
+          "Erfolg zu sehen. Du nimmst Dir vor, die Vitrine in Zukunft "
+          "haeufiger zu reinigen!"));
+        say(BS(
+          TPN+" schrubbt stundenlang an der Vitrine rum, bis sie endlich "
+          "wieder richtig sauber ist."),TP);
+        staub=0;
+      }
+  }
+  if(staub==0){
+    RemoveDetail(m_indices(QueryProp(P_DETAILS)));
+    GetTrophyDetails();
+    NeueDetails();
+   }
+  return 1;
+}
+
+void GetTrophyDetails(){
+  string *trophyliste,*shorts;
+  mapping trophydetails;
+
+  shorts=({});
+
+  trophyliste=MIRIL_TROPHYMASTER->GetPlacedTrophies(besitzer);
+
+  foreach( string tr : trophyliste )
+    shorts+=({ MIRIL_TROPHYMASTER->GetTrophyShort(tr) });
+
+  shorts = sort_array(shorts, #'>);
+  if(!sizeof(shorts))
+    AddDetail(({"pokale","pokal","in vitrine"}),
+                "Bislang ist die Vitrine noch leer.\n");
+  else
+  AddDetail(({"pokale","pokal","in vitrine"}),
+    "Du siehst folgende Pokale in der Vitrine:\n"
+    +implode(shorts,".\n")+".\n");
+
+  foreach( string tr : trophyliste )
+  {
+    AddDetail( MIRIL_TROPHYMASTER->GetTrophyIds(tr),
+               BS(MIRIL_TROPHYMASTER->GetTrophyLong(tr)));
+
+    trophydetails = MIRIL_TROPHYMASTER->GetTrophyDetails(tr);
+    if ( !sizeof(trophydetails) )
+      continue;
+    foreach ( mixed det, string det_desc : trophydetails )
+      AddDetail( det, BS(det_desc) );
+  }
+  return;
+}
+
+string *GetAllTrophyNames(){
+  int i,anzahl;
+  string *trophynamen;
+
+  trophynamen=({});
+
+  foreach(string bla:MIRIL_TROPHYMASTER->GetTrophyListe())
+    trophynamen+=MIRIL_TROPHYMASTER->GetTrophyIds(bla);
+
+  return trophynamen;
+}
+
+static int stell_cmd(string str){
+  string was,identifier;
+  int resultat;
+  object ob;
+  if(!str) return 0;
+  if(strstr(str,"vitrine")<0) return 0;
+  notify_fail("Das ist nicht Deine Vitrine!\n");
+  if(getuuid(TP)!=besitzer)
+    return 0;
+  notify_fail("Die Syntax ist: stelle <gegenstand> in vitrine!\n");
+  if(sscanf(str,"%s in vitrine",was)!=1)
+    return 0;
+
+  notify_fail("Die Vitrine sollte schon offen sein.\n");
+  if(QueryProp(P_CNT_STATUS)!=CNT_STATUS_OPEN && !IS_LEARNER(TP))
+    return 0;
+  notify_fail("Du solltest die Vitrine vorher erstmal saeubern!\n");
+  if(staub>20)
+    return 0;
+  notify_fail("Das kannst Du leider nicht in die Vitrine stellen!\n");
+  if(member(GetAllTrophyNames(),lower_case(was))<0
+     && lower_case(was)!="pokal")
+    return 0;
+  notify_fail("Das hast Du nicht!\n");
+  if(!ob=present(was,TP))
+    return 0;
+  notify_fail("Das kannst Du leider nicht in die Vitrine stellen!\n");
+  if(!ob->id("\nmiril_pokal"))
+    return 0;
+
+  identifier=ob->QueryIdentifier();
+  resultat=MIRIL_TROPHYMASTER->PlaceTrophy(getuuid(TP),identifier);
+
+  notify_fail("Hier stimmt etwas nicht, sag bitte einem Erzmagier Bescheid! "
+  "Resultat="+resultat+"\n");
+  if(resultat!=1)
+    return 0;
+  write(BS("Du stellst den Pokal in die Vitrine und bewunderst ihn noch ein "
+  "wenig.\n"));
+  say(TPN+" stellt einen Pokal in die Vitrine.\n",TP);
+  GetTrophyDetails();
+  ob->remove();
+  if(ob)
+    destruct(ob);
+  return 1;
+}
+
