--- MOO-1.8.1-waif/execute.c	Fri Jul 26 18:25:38 2002
+++ MOO-1.8.1/execute.c	Mon Jul 29 15:45:57 2002
@@ -955,7 +955,37 @@
 		index = POP();	/* index, should be integer */
 		list = POP();	/* lhs except last index, should be list or str */
 		/* whole thing should mean list[index] = value */
-		if ((list.type != TYPE_LIST && list.type != TYPE_STR)
+
+                if (list.type == TYPE_WAIF) {
+                    Objid class;
+                    Var args;
+                    enum error err = E_NONE;
+
+                    args = new_list(2);
+                    args.v.list[1] = var_ref(index);
+                    args.v.list[2] = var_ref(value);
+
+                    class = list.v.waif->class;
+                    if (!valid(class)) {
+                        err = E_INVIND;
+                    } else if (!is_wizard(db_object_owner(class))) {
+                        err = E_TYPE;
+                    } else {
+                        STORE_STATE_VARIABLES();
+                        err = _call_verb(class, WAIF_INDEXSET_VERB, list, args, 0);
+                        if (err == E_VERBNF) {
+                            err = E_TYPE;
+                        }
+                        LOAD_STATE_VARIABLES();
+                    }
+                    free_var(index);
+                    free_var(value);
+                    free_var(list);
+                    if (err != E_NONE) {
+                        free_var(args);
+                        PUSH_ERROR(err);
+                    }
+                } else if ((list.type != TYPE_LIST && list.type != TYPE_STR)
 		    || index.type != TYPE_INT
 		  || (list.type == TYPE_STR && value.type != TYPE_STR)) {
 		    free_var(value);
@@ -1260,7 +1290,34 @@
 		index = POP();	/* should be integer */
 		list = POP();	/* should be list or string */
 
-		if (index.type != TYPE_INT ||
+                if (list.type == TYPE_WAIF) {
+                    Objid class;
+                    Var args;
+                    enum error err = E_NONE;
+
+                    args = new_list(1);
+                    args.v.list[1] = var_ref(index);
+
+                    class = list.v.waif->class;
+                    if (!valid(class)) {
+                        err = E_INVIND;
+                    } else if (!is_wizard(db_object_owner(class))) {
+                        err = E_TYPE;
+                    } else {
+                        STORE_STATE_VARIABLES();
+                        err = _call_verb(class, WAIF_INDEX_VERB, list, args, 0);
+                        if (err == E_VERBNF) {
+                            err = E_TYPE;
+                        }
+                        LOAD_STATE_VARIABLES();
+                    }
+                    free_var(index);
+                    free_var(list);
+                    if (err != E_NONE) {
+                        free_var(args);
+                        PUSH_ERROR(err);
+                    }
+                } else if (index.type != TYPE_INT ||
 		    (list.type != TYPE_LIST && list.type != TYPE_STR)) {
 		    free_var(index);
 		    free_var(list);
--- MOO-1.8.1-waif/waif.h	Fri Jul 26 18:27:12 2002
+++ MOO-1.8.1/waif.h	Fri Jul 26 17:26:16 2002
@@ -26,6 +26,9 @@
 #define WAIF_PROP_PREFIX	':'
 #define WAIF_VERB_PREFIX	':'
 
+#define WAIF_INDEX_VERB ":_index"
+#define WAIF_INDEXSET_VERB ":_set_index"
+
 #include "db_private.h"
 
 typedef struct WaifPropdefs {

