   eeprom_update_word(&image.eval, (unsigned int)arg);
   eeprom_update_word(&image.globalenv, (unsigned int)GlobalEnv);
   eeprom_update_word(&image.gcstack, (unsigned int)GCStack);
-  eeprom_update_block(workspace, image.data, imagesize*4);
-  return imagesize+2;
+  #if SYMBOLTABLESIZE > BUFFERSIZE
+  eeprom_update_word(&image.symboltop, (unsigned int)SymbolTop);
+  eeprom_update_block(SymbolTable, image.table, SYMBOLTABLESIZE);
+  #endif
+  eeprom_update_block(Workspace, image.data, imagesize*4);
+  return imagesize;
 }
 
 int loadimage () {

  if (imagesize == 0 || imagesize == 0xFFFF) error(F("No saved image"));
  GlobalEnv = (object *)eeprom_read_word(&image.globalenv);
  GCStack = (object *)eeprom_read_word(&image.gcstack);
  eeprom_read_block(workspace, image.data, imagesize*4);
  gc(NULL, NULL);
  return imagesize+2;
}

// Error handling

void error (const __FlashStringHelper *string) {
  pfstring(F("Error: "));
  pfstring(string); pln();
  GCStack = NULL;
  longjmp(exception, 1);
}

void error2 (object *symbol, const __FlashStringHelper *string) {
  pfstring(F("Error: '"));
  printobject(symbol);
  pfstring(F("' "));
  pfstring(string); pln();
  GCStack = NULL;
  longjmp(exception, 1);

  return pgm_read_word(&lookup_table[name].max);
}

char *lookupbuiltin (symbol_t name) {
  char *buffer = SymbolTop;
  strcpy_P(buffer, (char *)(pgm_read_word(&lookup_table[name].string)));
  return buffer;
}

char *lookupsymbol (symbol_t name) {
  char *p = SymbolTable;
  int i=name-64000;
  while (i > 0 && p < SymbolTop) {p = p + strlen(p) + 1; i--; }
  if (p == SymbolTop) return NULL; else return p;
}

void deletesymbol (symbol_t name) {
  char *p = lookupsymbol(name);
  if (p == NULL) return;
  char *q = p + strlen(p) + 1;
  *p = '\0'; p++;
  while (q < SymbolTop) *(p++) = *(q++);
  SymbolTop = p;
}

// Main evaluator
