diff --git a/secure/awmaster.c b/secure/awmaster.c
index d9f0bbc..0cb902f 100644
--- a/secure/awmaster.c
+++ b/secure/awmaster.c
@@ -117,7 +117,7 @@
 void RegisterArmour()
 {   object  ob;
     string  id;
-    int     flag,h;
+    int     h;
 
     if (!objectp(ob=previous_object()) || 
       member(inherit_list(ob),"/std/armour.c")==-1)
@@ -126,26 +126,21 @@
     if (member(armours,id))
     {
         armours[id][AWM_TIME]=time();
-        flag=0;
         if ((h=({int})ob->QueryProp(P_AC)) > armours[id][AWM_CLASS])
         {
             armours[id][AWM_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_EFFECTIVE_AC)) > armours[id][AWM_EFF_CLASS])
         {
             armours[id][AWM_EFF_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_NR_HANDS)) < armours[id][AWM_HANDS])
         {
             armours[id][AWM_HANDS]=h;
-            flag=1;
         }
         if ((h=xflags(ob)) != armours[id][AWM_FLAGS])
         {
             armours[id][AWM_FLAGS]=h;
-            flag=1;
         }
     }
     else
@@ -171,7 +166,7 @@
 void RegisterWeapon()
 {   object  ob;
     string  id;
-    int     flag,h;
+    int     h;
 
     if (!objectp(ob=previous_object()) ||
       member(inherit_list(ob),"/std/weapon.c")==-1)
@@ -180,26 +175,21 @@
     if (member(weapons,id))
     {
         weapons[id][AWM_TIME] = time();
-        flag=0;
         if ((h=({int})ob->QueryProp(P_WC)) > weapons[id][AWM_CLASS])
         {
             weapons[id][AWM_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_EFFECTIVE_WC)) > weapons[id][AWM_EFF_CLASS])
         {
             weapons[id][AWM_EFF_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_NR_HANDS)) < weapons[id][AWM_HANDS])
         {
             weapons[id][AWM_HANDS]=h;
-            flag=1;
         }
         if ((h=xflags(ob)) != weapons[id][AWM_FLAGS])
         {
             weapons[id][AWM_FLAGS]=h;
-            flag=1;
         }
     }
     else
diff --git a/secure/errord.c b/secure/errord.c
index e257338..32977b1 100644
--- a/secure/errord.c
+++ b/secure/errord.c
@@ -1163,7 +1163,6 @@
       // Zeit alle ab Vollmagier
       case M_WRITE:
         return LEARNER_SECURITY;
-        break;
       // Loeschen und Fixen duerfen zur Zeit nur Zustaendige.
       case M_DELETE:
       case M_REASSIGN:
diff --git a/secure/explorationmaster.c b/secure/explorationmaster.c
index ecc6ee9..3b21587 100644
--- a/secure/explorationmaster.c
+++ b/secure/explorationmaster.c
@@ -294,14 +294,14 @@
 
 private string validOb(mixed ob)
 {
-  string fn, fpart;
+  string fn;
 
   if (!objectp(ob))
     return 0;
 
   fn = old_explode(object_name(ob),"#")[0];
-  fpart = old_explode(fn,"/")[<1];
  /*
+  string fpart = old_explode(fn,"/")[<1];
   if (query_once_interactive(ob))
     return 0;
 
@@ -346,7 +346,7 @@
        else bonus = clear_bit(bonus, obs[fn, MPOS_NUM]);
   }
   else {
-    int nr, i;
+    int nr;
 
     nr = 0;
     while (test_bit(alloc,nr))
@@ -642,10 +642,10 @@
     lastfound[name, 0] = time();
 
     if ( lastfound[name, 1] >= LF_WARN ){
-        object *u;
         int i;
         string *tmp;
 
+//        object *u;
 //        u = filter( users(), "check_arch" );
 //        map( u, #'tell_object/*'*/, "**** FP-Liste/Script " +
 //                   capitalize(name) + " (" + dtime(time()) + ") ****\n" );
@@ -900,12 +900,11 @@
 
   output="";
   if (!pattern || pattern=="")
-    teststring="%s";
-  else teststring="%s"+pattern+"%s";
+    teststring="%~s";
+  else teststring="%~s"+pattern+"%~s";
   walk_mapping( obs, function void (string fn, string* v1, int v2, int v3)
       {
-        string unused;
-        if ( test_bit(ep, v2) && sscanf(fn, teststring, unused, unused) )
+        if ( test_bit(ep, v2) && sscanf(fn, teststring) )
           printep(v2, fn, v3, v1);
       });
   ({void})this_interactive()->More(output);
@@ -918,7 +917,6 @@
 nomask int QueryLEP(int lep) {
     raise_error("Bitte QueryLEP() im LEPMASTER abfragen, nicht im "
        "EPMASTER!");
-    return(-1); //never reached
 }
 
 string QueryForschung()
diff --git a/secure/gildenmaster.c b/secure/gildenmaster.c
index 6018d9f..2954ce8 100644
--- a/secure/gildenmaster.c
+++ b/secure/gildenmaster.c
@@ -128,8 +128,6 @@
 }
 
 nomask int AddGuild(string gildob) {
-  object tp;
-
   if (!stringp(gildob) || !sizeof(gildob) || !security_check() 
       || file_size(GUILD_DIR+gildob+".c")<0)
       return 0;
@@ -141,8 +139,6 @@
 }
 
 nomask int RemoveGuild(string gildob) {
-  object tp;
-
   if (!stringp(gildob) || !sizeof(gildob) 
       || !security_check())
       return 0;
diff --git a/secure/inetd.c b/secure/inetd.c
index 23ab51c..ecf4943 100644
--- a/secure/inetd.c
+++ b/secure/inetd.c
@@ -91,7 +91,6 @@
 #define RETRY                "_RETRY"
 
 private nosave mapping hosts, pending_data, incoming_packets;
-private nosave mapping static_host_list;
 private nosave string *received_ids;
 private nosave int packet_id;
 
@@ -202,9 +201,6 @@
   if (!static_hosts)
       return; // retain the old list(s)
 
-  // remember the static hosts
-  static_host_list = m_reallocate(static_hosts,0);
-  
   // read the last host file dump and add the static hosts. Then the static
   // hosts have precedence over the ones from the dump.
   hosts = (read_host_list(HOST_FILE".dump") || ([])) + static_hosts;
@@ -601,7 +597,7 @@
 string encode_packet(mapping data) {
     int i;
     mixed indices;
-    string header, body, t1, t2;
+    string header, body;
     string *ret;
     status data_flag;
 
@@ -616,8 +612,8 @@
         // dabei nach ASCII wandeln und ggf. transliterieren. Aber sscanf
         // braucht wieder strings, daher muss es spaeter passieren (direkt vor
         // Senden).
-        if (sscanf(header, "%s:%s", t1, t2) ||
-            sscanf(header + body, "%s" + DELIMITER + "%s", t1, t2)
+        if (sscanf(header, "%~s:%~s") ||
+            sscanf(header + body, "%~s" + DELIMITER + "%~s")
         )
             return 0;
 
@@ -766,8 +762,6 @@
     mapping data;
 
     if (data = pending_data[id]) {
-        object ob;
-
 #ifdef INETD_DIAGNOSTICS
         data[PACKET_LOSS]++;
 #endif
diff --git a/secure/krautmaster.c b/secure/krautmaster.c
index 2c0dcba..0818d0c 100644
--- a/secure/krautmaster.c
+++ b/secure/krautmaster.c
@@ -43,16 +43,6 @@
 // krautprops[0] = 0; ID 0 darf nicht existieren
 private mixed *krautprops;
 
-// hier wird gespeichert welche Version einer Zutat fuer einen Spieler ist.
-// AN/TODO: Wenn das fuer Nichtseher nutzbar sein soll, sollte hier besser
-// mit getuuid() gearbeitet werden, statt getuid() zu verwenden.
-// player enthaelt fuer jede Spieler-UID einen Bitstring. Gesetztes Bit
-// bedeutet, dass der Spieler ueber das Kraut mit dieser ID etwas ueber
-// die Verwendung und Wirkung weiss. Es gibt jedoch noch keine Lernmoeglich-
-// keit und INSBESONDERE keine Funktionalitaet im Master, ueber die man 
-// die Bits setzen koennte.
-private mapping player;
-
 // verstuemmeltes mapping fuer den VC in service (Save-Dummy)
 private mapping map_ldfied;
 
@@ -129,7 +119,7 @@
       id2key=({});
       key2id=([]);
       krautprops=({});
-      player=([]);
+      //player=([]);
       map_ldfied=([]);
       rooms=([]);
    }
@@ -199,40 +189,11 @@
 // verwenden kann. Laut Kommentar unten muss man dafuer wohl was ueber das
 // Kraut gelernt haben, von wem ist mir gerade noch nicht klar.
 // AN/TODO: Es ist bisher keine Funktionalitaet vorhanden, um die IDs fuer
-// den Spieler freizuschalten. Die Funktionsweise muss aus dem Beispielcode
-// unten fuer das Learn-On-Demand abgelesen werden.
+// den Spieler freizuschalten.
 nomask int CanUseIngredient(object pl, int id)
 {
   // Ich mach mal den harten Weg. -- Humni
   return 1;
-  // Bitstring des Spielers aus der Liste auslesen.
-   string str=player[getuid(pl)];
-   if (!stringp(str)) str="";
-   if (test_bit(str, id))
-      return 1; // make the common case fast
-   else {
-     // letztenendes habe ich mich entschlossen einzubauen, das man nur die
-     // Kraeuter verwenden kann, ueber die man schonmal etwas gelesen/gelernt
-     // hat, aus diesem Grund, ist folgender Block auskommentiert.
-     // Dieser Block bedeutet quasi ein "auto learning on demand" d.h.
-     // wird ein Kraut verwendet wird geprueft ob fuer diese Gruppe bereits
-     // eine ID freigeschaltet wurde - ansonsten wird eine freigeschaltet.
-     /*
-         // pruefen ob fuer den Key bereits ein Bit gesetzt ist, ggf. setzen
-         if (id>=sizeof(id2key)) return 0; // illegale Id
-         int idlist=key2id[id2key[id]];
-         int i;
-         for (i=sizeof(idlist)-1; i>=0; i--) {
-           if (test_bit(str, idlist[i])) return 0; // Key bereits vorhanden
-         }
-         // Zufaellig ein Bit fuer den Key setzen
-         i=random(sizeof(idlist));
-         player[getuid(pl)]=set_bit(str, idlist[i]);
-         save_object(object_name());
-         return (i==id);
-     */
-     return 0;
-   }
 }
 
 // Diese Funktion wird vom Metzelorakel aufgerufen, um die Belohnungen zu
@@ -340,7 +301,6 @@
    // Allerdings muesste das vor dem explode() zur Zeilentrennung passieren.
    for ( ;si>=0; si--) 
    {
-     string lili=lines[si];
      if (strstr(lines[si],"##ende##")>=0) break;
    }
    si--;
@@ -708,9 +668,10 @@
 // angesteuert ueber das Planttool.
 int _showrooms(string str)
 {
-   int i, j, id;
-   string *list, dummy;
+   int i, id;
+   string *list;
    mixed *arr;
+
    if (!allowed()) return 0;
    notify_fail("Syntax: showrooms <id> oder showrooms all\n");
    if (str!="all") {
@@ -1152,7 +1113,7 @@
 // Fehler "index out of bounds", aber man muesste hier (TODO) sowieso mal
 // von explode() auf strstr() umbauen, denke ich.
 string _findplant(string str) {
-  int i, k;
+  int i;
   string *ind, *tmp;
 
   if(!str) return "";
@@ -1179,9 +1140,8 @@
   if (extern_call() && !allowed())
     return 0;
 
-  string *ind, *args, name;
+  string *ind, name;
   object *objs;
-  int k, l;
 
   objs = ({});
   if(!str) return "Keine Kraeuter uebergeben!";
diff --git a/secure/lepmaster.c b/secure/lepmaster.c
index 592b624..6cc4f60 100644
--- a/secure/lepmaster.c
+++ b/secure/lepmaster.c
@@ -163,7 +163,6 @@
 #else
   return lep/100;
 #endif // __PFOERKL__
-  return 0;
 }
 
 // Wieviele LEP fehlen zum naechsten Level?
diff --git a/secure/mailer.c b/secure/mailer.c
index bc22db9..0201079 100644
--- a/secure/mailer.c
+++ b/secure/mailer.c
@@ -264,7 +264,7 @@
 
 public string *DeliverMail( mixed msg, int expa )
 {
-    string sender, *recipients, *recok, t, *tmp;
+    string sender, *recipients, *recok, *tmp;
     <string|string*>* newmsg;
     int i;
 #ifdef INTERNET_MAIL_ENABLED
@@ -275,7 +275,6 @@
         return 0;
 
     DEBUG( sprintf( "DeliverMail: %O %O\n", msg[0..4] +({0})+ msg[6..7], expa ) );
-    t = ctime(time());
 
     // Ohne Empfaenger wird abgebrochen
     if (!stringp(msg[MSG_RECIPIENT]))
@@ -365,6 +364,7 @@
 #ifdef INTERNET_MAIL_ENABLED
             // Zustellung in den Rest des Internets.
             else {
+                string t = ctime(time());
                 ext = 1;
                 sender = explode( sender, "%" )[0];
                 rec = explode( regreplace( rec, "@", "%", 1 ), "%" )[0];
@@ -419,7 +419,7 @@
 
 public int FingerMail( string user )
 {
-    int newfolder, i;
+    int newfolder;
 
     //Zugriff beschraenken, Zahl der gelesenen Mails ist Privatsphaere
     if (!objectp(this_interactive()) || !stringp(user) || !sizeof(user)) 
diff --git a/secure/master/cidr.c b/secure/master/cidr.c
index c35ba21..d6c36cd 100644
--- a/secure/master/cidr.c
+++ b/secure/master/cidr.c
@@ -90,9 +90,7 @@
       default: // ungueltige Adresse
         return __INT_MAX__;
     }
-
     // hier sollte man gar nicht ankommen.
-    return __INT_MAX__;
 }
 
 string IPv4_int2addr(int ip) {
diff --git a/secure/materialdb.c b/secure/materialdb.c
index 94c57b6..a1240a8 100644
--- a/secure/materialdb.c
+++ b/secure/materialdb.c
@@ -216,6 +216,7 @@
       casus=0;
     return names[casus];
   }
+  return 0;
 }
 
 varargs string ConvMaterialList(mixed mats, int casus, mixed idinf) {
@@ -240,6 +241,7 @@
     }
     return ml;
   }
+  return 0;
 }
 
 int MaterialGroup(mapping mats, string grp) {
@@ -265,6 +267,7 @@
        res=100;
      return res;
    }
+   return 0;
 }
 
 string *AllMaterials() {
@@ -318,6 +321,7 @@
     else
       return "Unbekanntes";
   }
+  return 0;
 }
 
 string GroupDescription(string grp) {
@@ -327,6 +331,7 @@
     else
       return "Gruppe unbekannt";
   }
+  return 0;
 }
 
 //==================== Generieren von Headerfile und Manpages
@@ -369,7 +374,7 @@
 }
 private string gen_material_h_materials()
 {
-  string txt, last_grp;
+  string txt;
   string *grps, *mats;
   txt = "// ****************************** Materialien ******************************\n";
   // Gruppenweise ordnen
@@ -470,7 +475,6 @@
 varargs void GenMatList(string fn)
 {
   if (initialized) {
-    string txt;
     if (!stringp(fn) || !sizeof(fn))
       fn = DOC_DIR("materialliste");
     if (file_size(fn) >= 0) {
@@ -501,7 +505,6 @@
 varargs void GenMatGroupList(string fn)
 {
   if (initialized) {
-    string txt;
     if (!stringp(fn) || !sizeof(fn))
       fn = DOC_DIR("materialgruppen");
     if (file_size(fn) >= 0) {
@@ -533,7 +536,6 @@
 varargs void GenHeaderFile(string fn)
 {
   if (initialized) {
-    string txt;
     if (!stringp(fn) || !sizeof(fn))
       fn = HEADERFILE;
     if (file_size(fn) >= 0)
@@ -680,7 +682,6 @@
   fn = MAT_DIR+"/groups/"+id;
   if (file_size(fn) > 0) {
     mapping parts;
-    string desc;
     parts = getDescParts(read_file(fn));
     m = ([P_NAME:parts["Name"],
           P_MEMBERS:({})]);
@@ -808,7 +809,7 @@
      ...)
   */
   mapping m;
-  mixed val, val2;
+  mixed val;
   m = ([]);
   // Der string fuer das #define zuerst:
   val = convMatId(desc["Materialid"]);
@@ -856,7 +857,6 @@
   fn = MAT_DIR+"/materials/"+id;
   if (file_size(fn) > 0) {
     mapping parts;
-    string desc;
     parts = getDescParts(read_file(fn));
     m = convMaterialDesc(id, parts);
   } else {
@@ -891,7 +891,7 @@
 }
 
 private varargs void doScanMaterials(string* mats, int i, int step) {
-  int ticks, start;
+  int start;
   string matid;
   start = get_eval_cost();
   if (step < 2) {
diff --git a/secure/news.c b/secure/news.c
index f435089..c587dcb 100644
--- a/secure/news.c
+++ b/secure/news.c
@@ -151,8 +151,6 @@
 
 int RemoveGroup(string name)
 {
-  int num;
-
   if (!name) return 0;
 
   if (!security(name) || process_call()) return -1; // Darf nicht
@@ -170,8 +168,6 @@
 
 int SetGroup(string name,int dlevel,int        wlevel,int rlevel,int maxmessages,int expire)
 {
-  mixed *group;
-  
   if (!member(grouplist,name)) return -2;
   if (grouplist[name,G_OWNER]!=user_euid() &&
       (!security(name) || process_call())) return -1;
@@ -188,8 +184,6 @@
 
 int AddAllowed(string name,mixed deleters,mixed writers,mixed readers)
 {
-  mixed *group;
-
   if (!member(grouplist,name)) return -2;
 
   if ( grouplist[name,G_OWNER]!=user_euid() &&
@@ -214,8 +208,6 @@
 
 int RemoveAllowed(string name,mixed deleters,mixed writers,mixed readers)
 {
-  mixed *group;
-
   if (!member(grouplist,name)) return -2;
 
   if (grouplist[name,G_OWNER]!=user_euid() &&
@@ -298,7 +290,6 @@
 int WriteNote(mixed message,mixed keepname)
 {
   mixed group;
-  int uidok,tmp;
   string name;
 
   if (!pointerp(message) || sizeof(message)!=6) return 0;
@@ -325,7 +316,6 @@
 
 int RemoveNote(string name, int note)
 {
-  int num;
   mixed group;
 
   if ((note<0) && (name=="dwnews"))
@@ -429,7 +419,7 @@
 
 void dump_group(string grp)
 {
-  int to_expire,size,last;
+  int size,last;
   mixed group;
 
   if (!ARCH_SECURITY || process_call()) return;
@@ -476,7 +466,6 @@
 
 static mixed load_group(string name)
 {
-  int num;
   mixed *ret;
 
   if(!member(grouplist,name)) return -1;
@@ -498,7 +487,7 @@
 mixed GetGroups()
 {
   mixed *returnlist;
-  int i,group,slevel;
+  int i,slevel;
   string seuid;
 
   returnlist=sort_array(m_indices(grouplist),#'>); //');
diff --git a/secure/potionmaster.c b/secure/potionmaster.c
index e2aa300..2be898f 100644
--- a/secure/potionmaster.c
+++ b/secure/potionmaster.c
@@ -161,7 +161,6 @@
   if ( file_size( TIPS(to_string(nextroom)+".zt") ) < 0 ) {
     raise_error("Potionmaster: Tipfile missing, please create "+
       to_string(nextroom)+".zt");
-    return POT_NO_SUCH_FILE;
   }
   // Neuer Raum darf noch nicht in der Liste enthalten sein.
   if ( member(m_values(potions,POT_ROOMNAME), room)!=-1)
diff --git a/secure/questmaster.c b/secure/questmaster.c
index e142acf..e89c5a4 100644
--- a/secure/questmaster.c
+++ b/secure/questmaster.c
@@ -164,7 +164,7 @@
 
 private int RecalculateQP() {
   int i;
-  mixed q,n;
+  mixed q;
 
   if (!allowed_write_access())
     return -1;
@@ -172,7 +172,6 @@
   max_QP=0;
   opt_QP=0;
 
-  n=m_indices(quests);
   q=m_values(quests);
     for (i=sizeof(q)-1;i>=0;i--)
       if (q[i][Q_ACTIVE]) {
@@ -189,7 +188,6 @@
       string *allowedobj, string hint, int difficulty, int questclass,
       int active, string wiz, string scndwiz, int questattribute)
 {
-  mixed *quest;
   int i;
 
   if (!allowed_write_access()) return 0;
@@ -229,8 +227,6 @@
 }
 
 int RemoveQuest(string name) {
-  mixed *quest;
-
   if (!allowed_write_access()) return 0;
   if (!quests[name]) return -1;
   QMLOG(sprintf("remove: %s %O (%s)",name,quests[name],
@@ -431,7 +427,7 @@
 #define FILTER_UNGELOEST 2
 varargs string liste(mixed pl, int geloest_filter)
 {
-  int qgroups, i, j, qrfw;
+  int qgroups, i, j;
   mixed *qlists, *qgrouped, *qtmp;
   string str;
   string ja, nein, format, ueberschrift;
@@ -809,7 +805,6 @@
   }
 
   mixed *altemq = m_entry(miniquests, mq_obj);
-  int nummer = miniquests[mq_obj,MQ_DATA_QUESTNO];
   miniquests[mq_obj, param] = newvalue;
 
   save_info();
diff --git a/secure/scoremaster.c b/secure/scoremaster.c
index 83dc466..004e341 100644
--- a/secure/scoremaster.c
+++ b/secure/scoremaster.c
@@ -762,7 +762,6 @@
 {
   mixed info;
   object po;
-  int drin;
   string pls, ek;
 
 
@@ -1161,10 +1160,6 @@
 // return valid tips from database or existing 
 public string getTip(mixed key)
 {
-  string fn;
-  string tip;
-  string* path;
-  
   if (!ektipAllowed())
     return "";
   
diff --git a/secure/telnetneg.c b/secure/telnetneg.c
index c5da0d2..8cbc7a9 100644
--- a/secure/telnetneg.c
+++ b/secure/telnetneg.c
@@ -232,28 +232,24 @@
       if (opt->state->localside)
         return -2;
       return send_telnet_neg( ({ WILL, option }) );
-      break;
     case WONT:
       if (opt->lo_wishes->localside != 0)
         return -1;
       if (!opt->state->localside)
         return -2;
       return send_telnet_neg( ({ WONT, option }) );
-      break;
     case DO:
       if (opt->lo_wishes->remoteside != 0)
         return -1;
       if (opt->state->remoteside)
         return -2;
       return send_telnet_neg( ({ DO, option }) );
-      break;
     case DONT:
       if (opt->lo_wishes->remoteside != 0)
         return -1;
       if (!opt->state->remoteside)
         return -2;
       return send_telnet_neg( ({ DONT, option }) );
-      break;
   }
   raise_error(sprintf("Unsupported telnet negotation action in "
       "do_telnet_neg(): %d\n",action));
diff --git a/secure/udp/reply.c b/secure/udp/reply.c
index 43b70ce..e60f618 100644
--- a/secure/udp/reply.c
+++ b/secure/udp/reply.c
@@ -12,7 +12,7 @@
 
 void udp_reply(mapping data)
 {
-  string err,recpt,serv;
+  string serv;
   object ob;
   
   if (pointerp(data[SYSTEM])&&member(data[SYSTEM],TIME_OUT)>-1)
diff --git a/secure/udp_mail.c b/secure/udp_mail.c
index 4bd8d74..2f13f1d 100644
--- a/secure/udp_mail.c
+++ b/secure/udp_mail.c
@@ -59,9 +59,7 @@
 
 static void remove_from_spool(string spool_file)
 {
-  int idx;
-
-  if(spool && (idx=member(spool,spool_file))!=-1)
+  if(spool && (member(spool,spool_file))!=-1)
     {
       spool -= ({ spool_file });
       if(!sizeof(spool))
diff --git a/secure/zweities.c b/secure/zweities.c
index dfc4c2e..afcef41 100644
--- a/secure/zweities.c
+++ b/secure/zweities.c
@@ -273,7 +273,6 @@
   }
   else
     return QueryFamilie(previous_object());
-  return 0;
 }
 
 // Die Familienaliase abfragen. Entweder ein bestimmtes oder alle. Eine
