Ok, narrowed down the problem. In the Profile.pl the code that updates the board was being inserted into the wrong sub. It was in ModifyProfile2 instead of ModifyProfileOptions2 so I moved it, and it works as designed.
Here is the code in question:
#find out which parts, related to boards, have changed
if(${$uid.$user}{'ext_0'} && ($member{'ext_0'} eq "")){
#delete from control file
@forumControl = &loadBoards('forum.control');
#don't pass 3rd argument if deleting from an array (only pass it for a file)
&deleteBlog($INFO{'username'}, \@forumControl, 'forum.control');
#delete from global array
&deleteBlog($INFO{'username'}, \@allBoards);
#delete from forum.master
&updateForumMaster($INFO{'username'}, 'delete');
}
elsif(!(${$uid.$user}{'ext_0'}) && ($member{'ext_0'} =~m/on/)){
#create a new board
&createBoard($INFO{'username'}, $member{'ext_01'}, $member{'userpic'});
}
#this member has a blog
elsif(${$uid.$user}{'ext_0'}){
&checkUpdateBoard(${$uid.$user}{'ext_1'}, $member{'ext_1'}, ${$uid.$user}{'userpic'}, $member{'userpic'}, $INFO{'username'});
}
In Profile.pl remove it from it's current location and put it before:
&ToHTML($member{'userpic'});
&ToHTML($member{'usertimeoffset'});
&ToHTML($member{'usertimeselect'});
&ToHTML($member{'usertemplate'});
&ToHTML($member{'userlanguage'});
&ToHTML($member{'timeformat'});
In the ModifyProfileOptions subroutine.
I have updated the mod attached to the first post.
Cheers for pointing that out to me.