anchor.diff:    end;
   end;
   
  +// shallow way to recognize item as Shield
  +function isShield(item: IInterface): boolean;
  +var
  +  tmp: IInterface;
  +begin
  +	Result := false;
  +
  +	if (Signature(item) = 'ARMO') then begin
  +		tmp := GetElementEditValues(item, 'ETYP');
  +		if (Assigned(tmp) and (tmp = 'Shield [EQUP:000141E8]')) then begin
  +			Result := true;
  +		end else if hasKeyword(item, 'ArmorShield') then begin
  +			Result := true;
  +		end;
  +	end;
  +
  +end;
  +
   // shallow way to recognize item as Staff
   function isStaff(item: IInterface): boolean;
   var
  
positive.code: // creates new COBJ record to make item Temperable
  function makeTemperable(itemRecord: IInterface): IInterface;
  var
    recipeTemper,
      recipeCondition, recipeConditions,
      recipeItem, recipeItems
    : IInterface;
  begin
    recipeTemper := createRecipe(itemRecord);
  
    // add new condition list
    Add(recipeTemper, 'Conditions', true);
    // get reference to condition list inside recipe
    recipeConditions := ElementByPath(recipeTemper, 'Conditions');
  
    // add IsEnchanted condition
    // get new condition from list
    recipeCondition := ElementByIndex(recipeConditions, 0);
    // set type to Not equal to / Or
    SetElementEditValues(recipeCondition, 'CTDA - \Type', '00010000');
    // set some needed properties
    SetElementEditValues(recipeCondition, 'CTDA - \Comparison Value', '1');
    SetElementEditValues(recipeCondition, 'CTDA - \Function', 'EPTemperingItemIsEnchanted');
    SetElementEditValues(recipeCondition, 'CTDA - \Run On', 'Subject');
    // don't know what is this, but it should be equal to -1, if Function Runs On Subject
    SetElementEditValues(recipeCondition, 'CTDA - \Parameter #3', '-1');
  
    // add second condition, for perk ArcaneBlacksmith check
    addPerkCondition(recipeConditions, getRecordByFormID('0005218E')); // ArcaneBlacksmith
  
    // add required items list
    Add(recipeTemper, 'items', true);
    // get reference to required items list inside recipe
    recipeItems := ElementByPath(recipeTemper, 'items');
  
    if Signature(itemRecord) = 'WEAP' then begin
      // set EditorID for recipe
      SetElementEditValues(recipeTemper, 'EDID', 'TemperWeapon' + GetElementEditValues(itemRecord, 'EDID'));
  
      // add reference to the workbench keyword
      SetElementEditValues(recipeTemper, 'BNAM', GetEditValue(
        getRecordByFormID(WEAPON_TEMPERING_WORKBENCH_FORM_ID)
      ));
  
    end else if Signature(itemRecord) = 'ARMO' then begin
      // set EditorID for recipe
      SetElementEditValues(recipeTemper, 'EDID', 'TemperArmor' + GetElementEditValues(itemRecord, 'EDID'));
  
      // add reference to the workbench keyword
      SetElementEditValues(recipeTemper, 'BNAM', GetEditValue(
        getRecordByFormID(ARMOR_TEMPERING_WORKBENCH_FORM_ID)
      ));
    end;
  
    // figure out required component...
    addItem(recipeItems, getMainMaterial(itemRecord), 1);
  
    // remove nil record in items requirements, if any
    removeInvalidEntries(recipeTemper);
  
    if GetElementEditValues(recipeTemper, 'COCT') = '' then begin
      warn('no item requirements was specified for - ' + Name(recipeTemper));
    end;
  
    // return created tempering recipe, just in case
    Result := recipeTemper;
  end;
  
  // based on Skyrim - Remove invalid entries
  // removes invalid entries from containers and recipe items, from Leveled lists, NPCs and spells
  procedure removeInvalidEntries(rec: IInterface);
  var
    i, num: integer;
    lst, ent: IInterface;
    recordSignature,
      refName, // path to FormID reference relative to list's entry
      countname // counter sub record to update
    : string;
  begin
    recordSignature := Signature(rec);
  
    // containers and constructible objects
    if (recordSignature = 'CONT') or (recordSignature = 'COBJ') then begin
      lst := ElementByName(rec, 'Items');
      refName := 'CNTO\Item';
      countname := 'COCT';
    end
    // leveled items, NPCs and spells
    else if (recordSignature = 'LVLI') or (recordSignature = 'LVLN') or (recordSignature = 'LVSP') then begin
      lst := ElementByName(rec, 'Leveled List Entries');
      refName := 'LVLO\Reference';
      countname := 'LLCT';
    end
    // Outfits
    else if recordSignature = 'OTFT' then begin
      lst := ElementByName(rec, 'INAM');
      refName := 'item';
    end;
  
    if not Assigned(lst) then
      Exit;
  
    num := ElementCount(lst);
    // check from the end since removing items will shift indexes
    for i := num - 1 downto 0 do begin
      // get individual entry element
      ent := ElementByIndex(lst, i);
      // Check() returns error string if any or empty string if no errors
      if Check(ElementByPath(ent, refName)) <> '' then
        Remove(ent);
    end;
  
    // has counter
    if Assigned(countname) then begin
      // update counter sub record
      if num <> ElementCount(lst) then begin
        num := ElementCount(lst);
        // set new value or remove sub record if list is empty (like CK does)
        if num > 0 then
          SetElementNativeValues(rec, countname, num)
        else
          RemoveElement(rec, countname);
      end;
    end;
  end;
  
  // removes keyword to the record, if it has one
  
negative.code:   isCraftable          (recordToCheck: IInterface): boolean;                      // determines if item have crafting recipe
    isJewelry            (item: IInterface): boolean;                               // shallow way to recognize item as Jewelry
    isStaff              (item: IInterface): boolean;                               // shallow way to recognize item as Staff
    isShield             (item: IInterface): boolean;                               // shallow way to recognize item as Shield
  
    addItem              (list: IInterface; item: IInterface; amount: int) AddedListElement: IInterface;  // adds item to list, like items/Leveled entries
    addToLeveledList     (list: IInterface; entry: IInterface; level: int) AddedListElement: IInterface;  // adds item reference to the leveled list
  