diff -uprN -x *.o ./.cvsignore ../OLC2/.cvsignore
--- ./.cvsignore	Wed Dec 31 19:00:00 1969
+++ ../OLC2/.cvsignore	Mon May  8 22:15:41 2000
@@ -0,0 +1,3 @@
+conf.h
+.accepted
+Makefile
diff -uprN -x *.o ./comm.c ../OLC2/comm.c
--- ./comm.c	Mon May  8 22:52:00 2000
+++ ../OLC2/comm.c	Mon May  8 22:41:09 2000
@@ -1850,6 +1850,7 @@ void close_socket(struct descriptor_data
   /*. Kill any OLC stuff .*/
   switch (d->connected) {
     case CON_OEDIT:
+    case CON_IEDIT:
     case CON_REDIT:
     case CON_ZEDIT:
     case CON_MEDIT:
diff -uprN -x *.o ./constants.c ../OLC2/constants.c
--- ./constants.c	Mon May  8 22:52:00 2000
+++ ../OLC2/constants.c	Mon May  8 22:43:08 2000
@@ -241,6 +241,7 @@ const char *connected_types[] = {
   "Mobile edit",
   "Shop edit",
   "Text edit",
+  "iObject Edit",
   "\n"
 };
 
diff -uprN -x *.o ./db.c ../OLC2/db.c
--- ./db.c	Mon May  8 22:52:00 2000
+++ ../OLC2/db.c	Mon May  8 22:15:41 2000
@@ -2914,6 +2914,12 @@ int read_xap_objects(FILE *fl,struct cha
           temp->affected[j].modifier = 0;
         }
 
+       /* You have to null out the extradescs when you're parsing a xap_obj.
+           This is done right before the extradescs are read. */
+
+        if (temp->ex_description) {
+          temp->ex_description = NULL;
+        }
 
         for (k=j=zwei=0;!zwei && !feof(fl);) {
           switch (*line) {
diff -uprN -x *.o ./db.h ../OLC2/db.h
--- ./db.h	Mon May  8 22:52:00 2000
+++ ../OLC2/db.h	Mon May  8 22:46:21 2000
@@ -240,6 +240,6 @@ extern char	*NOPERSON;
 extern char	*NOEFFECT;
 #endif
 
-void strip_string(char *buffer);
 int read_xap_objects(FILE *fl,struct char_data *ch);
 
+void strip_string(char *buffer);
diff -uprN -x *.o ./interpreter.c ../OLC2/interpreter.c
--- ./interpreter.c	Mon May  8 22:52:00 2000
+++ ../OLC2/interpreter.c	Mon May  8 22:39:55 2000
@@ -117,6 +117,7 @@ ACMD(do_help);
 ACMD(do_hide);
 ACMD(do_hit);
 ACMD(do_house);
+ACMD(do_iedit);
 ACMD(do_info);
 ACMD(do_insult);
 ACMD(do_inventory);
@@ -340,6 +341,7 @@ cpp_extern const struct command_info cmd
   { "hug"      , POS_RESTING , do_action   , 0, 0 },
 
   { "inventory", POS_DEAD    , do_inventory, 0, 0 },
+  { "iedit"    , POS_DEAD   , do_iedit    , LVL_IMMORT, 0 },
   { "idea"     , POS_DEAD    , do_gen_write, 0, SCMD_IDEA },
   { "imotd"    , POS_DEAD    , do_gen_ps   , LVL_IMMORT, SCMD_IMOTD },
   { "immlist"  , POS_DEAD    , do_gen_ps   , 0, SCMD_IMMLIST },
@@ -1314,6 +1316,7 @@ void nanny(struct descriptor_data *d, ch
     { CON_SEDIT, sedit_parse },
     { CON_MEDIT, medit_parse },
     { CON_REDIT, redit_parse },
+    { CON_IEDIT, oedit_parse },
     { -1, NULL }
   };
 
diff -uprN -x *.o ./modify.c ../OLC2/modify.c
--- ./modify.c	Mon May  8 22:13:15 2000
+++ ../OLC2/modify.c	Mon May  8 22:40:51 2000
@@ -159,6 +159,7 @@ void string_add(struct descriptor_data *
         case CON_REDIT:
         case CON_MEDIT:
         case CON_OEDIT:
+        case CON_IEDIT:
         case CON_EXDESC:
           free(*d->str);
           *d->str = d->backstr;
diff -uprN -x *.o ./oasis.h ../OLC2/oasis.h
--- ./oasis.h	Mon May  8 22:13:15 2000
+++ ../OLC2/oasis.h	Mon May  8 22:38:06 2000
@@ -91,6 +91,7 @@ struct oasis_olc_data {
   struct obj_data *obj;
   struct zone_data *zone;
   struct shop_data *shop;
+  struct obj_data *iobj;
   struct extra_descr_data *desc;
 #if CONFIG_OASIS_MPROG
   struct mob_prog_data *mprog;
@@ -113,6 +114,7 @@ extern const char *nrm, *grn, *cyn, *yel
 #define OLC_ZNUM(d) 	(OLC(d)->zone_num)	/* Real zone number.	*/
 #define OLC_ROOM(d) 	(OLC(d)->room)		/* Room structure.	*/
 #define OLC_OBJ(d) 	(OLC(d)->obj)		/* Object structure.	*/
+#define OLC_IEDIT(d)    (OLC(d)->iobj)	 	/* iObject structure    */
 #define OLC_ZONE(d)     (OLC(d)->zone)		/* Zone structure.	*/
 #define OLC_MOB(d)	(OLC(d)->mob)		/* Mob structure.	*/
 #define OLC_SHOP(d) 	(OLC(d)->shop)		/* Shop structure.	*/
@@ -328,6 +330,9 @@ void oedit_disp_menu(struct descriptor_d
 void oedit_parse(struct descriptor_data *d, char *arg);
 void oedit_disp_perm_menu(struct descriptor_data *d);
 void oedit_string_cleanup(struct descriptor_data *d, int terminator);
+
+void iedit_setup_existing(struct descriptor_data *d, struct obj_data *obj);
+void iedit_parse(struct descriptor_data *d, char *arg);
 
 void redit_string_cleanup(struct descriptor_data *d, int terminator);
 void redit_setup_new(struct descriptor_data *d);
diff -uprN -x *.o ./objsave.c ../OLC2/objsave.c
--- ./objsave.c	Mon May  8 22:52:00 2000
+++ ../OLC2/objsave.c	Mon May  8 22:15:41 2000
@@ -1489,6 +1489,10 @@ int Crash_load_xapobjs(struct char_data 
           temp->affected[j].modifier = 0;
         }
 
+        if (temp->ex_description) {
+          temp->ex_description = NULL;
+        }
+
         get_line(fl,line);
         for (k=j=zwei=0;!zwei && !feof(fl);) {
           switch (*line) {
diff -uprN -x *.o ./oedit.c ../OLC2/oedit.c
--- ./oedit.c	Mon May  8 22:13:16 2000
+++ ../OLC2/oedit.c	Mon May  8 22:49:18 2000
@@ -20,7 +20,7 @@
 #include "genobj.h"
 #include "oasis.h"
 #include "improved-edit.h"
-
+#include "handler.h"
 /*------------------------------------------------------------------------*/
 
 /*
@@ -616,14 +616,39 @@ void oedit_parse(struct descriptor_data 
     switch (*arg) {
     case 'y':
     case 'Y':
-      SEND_TO_Q("Saving object to memory.\r\n", d);
-      oedit_save_internally(d);
-      sprintf(buf, "OLC: %s edits obj %d", GET_NAME(d->character), OLC_NUM(d));
-      mudlog(buf, CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE);
+      if(STATE(d) == CON_OEDIT) {
+        send_to_char("Saving object to memory.\r\n", d->character);
+        oedit_save_internally(d);
+        sprintf(buf, "OLC: %s edits obj %d", GET_NAME(d->character), OLC_NUM(d));
+        mudlog(buf, CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE);
+        cleanup_olc(d, CLEANUP_STRUCTS);
+      } else {  /* case is iedit */
+        send_to_char("Commiting iedit changes.\r\n", d->character);
+        *(OLC_IEDIT(d)) = *(OLC_OBJ(d));
+  /* Xap - ought to save the old pointer, free after assignment I suppose */
+        sprintf(buf, "OLC: %s uses iedit", GET_NAME(d->character));
+        mudlog(buf, CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE);
+        if (d->character) {
+          REMOVE_BIT(PLR_FLAGS(d->character), PLR_WRITING);
+          STATE(d) = CON_PLAYING;
+          act("$n stops using OLC.", TRUE, d->character, 0, 0, TO_ROOM);
+        }
+        free(d->olc);
+      }
+      return;
       /* Fall through. */
     case 'n':
     case 'N':
-      cleanup_olc(d, CLEANUP_ALL);
+      if(STATE(d) == CON_OEDIT) {
+        cleanup_olc(d, CLEANUP_ALL);
+      } else {
+        if (d->character) {
+          REMOVE_BIT(PLR_FLAGS(d->character), PLR_WRITING);
+          STATE(d) = CON_PLAYING;
+          act("$n stops using OLC.", TRUE, d->character, 0, 0, TO_ROOM);
+        }
+        free(d->olc);
+      }
       return;
     default:
       SEND_TO_Q("Invalid choice!\r\n", d);
@@ -1063,3 +1088,89 @@ void oedit_string_cleanup(struct descrip
     break;
   }
 }
+
+/* this is all iedit stuff */
+void iedit_setup_existing(struct descriptor_data *d,
+  struct obj_data *real_num) {
+  struct obj_data *obj=NULL;
+
+  OLC_IEDIT(d) = real_num;
+
+  copy_object(obj,real_num);
+
+  OLC_OBJ(d) = obj;
+  OLC_IEDIT(d) = real_num;
+  OLC_VAL(d) = 0;
+  oedit_disp_menu(d);
+}
+
+/* Iedit is just a stripped down interface to oedit.  Basically, it lets
+   you edit individual instantiations of an object.  I'd recommend using
+   it with the xapobjs patch, else you may notice that your individual
+   objects do crazy things when you save/return */
+
+/* You know what? I can put anything in a comment!  That's right!
+   So, the other day, I was listening to the radio, and they give
+   this funny situation:
+       This 19 year-old kid went out and had his 17-year old girl
+     friend get breast enlargement surgery.  He stole his mothers
+     credit card to pay for the 2500$ operation.  Ouch.
+       Now, his mother presses credit fraud charges, and he ends up
+     paying the full 2500$ + 1500$ for a fine.  Then his 'enhanced'
+     girlfriend ditches him for someone with money, and no criminal
+     record.... Now, what is the moral of the story?
+       If you're going to pay for your girlfriends cosmetic surgery,
+     at least steal your _dad's_ card! At least then you can justify
+     it.  I mean.. what's he going to say?
+	"YOUNG MAN! YOU WILL NEVER DO IT AGAIN! .. unless you can get your
+	 girlfriend to bring your mother?"
+      or.. why wait for him to bring it up?
+        "Dad.. c'mon!  22b.. 38d.. You do the math!"
+     .... or you can wait for the opening comment that you know is coming..
+	   "YOUNG MAN! WHAT WERE YOU THINKING!?!?"
+		"Now that's a really silly question isn't it?"
+    I suppose that will do for inane for now. */
+
+ACMD(do_iedit) {
+  struct obj_data *k;
+  int found=0;
+  int tmp;
+  extern struct room_data *world;
+
+  one_argument(argument, arg);
+
+  if(!*arg || !*argument) {
+    send_to_char("You must supply an object name.\r\n",ch);
+  }
+
+  if ((k = get_object_in_equip_vis(ch, arg, ch->equipment, &tmp))) {
+    found=1;
+  } else if ((k = get_obj_in_list_vis(ch, arg, ch->carrying))) {
+    found=1;
+  } else if ((k = get_obj_in_list_vis(ch, arg,
+        world[ch->in_room].contents))) {
+    found =1;
+  } else if ((k = get_obj_vis(ch, arg))) {
+    found=1;
+  }
+
+  if (!found) {
+    send_to_char("Couldn't find that object. Sorry.\r\n",ch);
+    return;
+  }
+
+                /* set up here */
+  CREATE(OLC(ch->desc), struct oasis_olc_data, 1);
+  SET_BIT(GET_OBJ_EXTRA(k), ITEM_UNIQUE_SAVE);
+
+  SET_BIT(PLR_FLAGS(ch), PLR_WRITING);
+  iedit_setup_existing(ch->desc,k);
+  OLC_VAL(ch->desc) = 0;
+
+  act("$n starts using OLC.", TRUE, ch, 0, 0, TO_ROOM);
+
+  STATE(ch->desc) = CON_IEDIT;
+
+  return;
+}
+
diff -uprN -x *.o ./structs.h ../OLC2/structs.h
--- ./structs.h	Mon May  8 22:52:00 2000
+++ ../OLC2/structs.h	Mon May  8 22:16:34 2000
@@ -252,6 +252,7 @@
 #define CON_MEDIT        21		/* OLC mode - mobile editor	*/
 #define CON_SEDIT        22		/* OLC mode - shop editor	*/
 #define CON_TEDIT        23		/* OLC mode - text editor	*/
+#define CON_IEDIT        24             /*  OLC mode - individual edit  */
 
 /* Character equipment positions: used as index for char_data.equipment[] */
 /* NOTE: Don't confuse these constants with the ITEM_ bitvectors
