-
-  my $pars = {quoteChars => $param -> {quoteChars},
-              messages   => $param -> {messages}};
-
-  my %error = (threadWrite => '1 could not write thread file',
-               forumWrite  => '2 could not write forum file',
-               threadFile  => '3 could not load thread file',
-               noParent    => '4 could not find parent message');
-
-  # neue Nachricht
-  unless ($param -> {parentMessage}) {
-    $tid   = 't'.($param -> {lastThread} + 1);
-    $thread = create_new_thread ({msg      => $mid,
-                                  ip       => $param -> {ip},
-                                  name     => $param -> {author},
-                                  email    => $param -> {email},
-                                  home     => $param -> {homepage},
-                                  image    => $param -> {image},
-                                  category => $param -> {category},
-                                  subject  => $param -> {subject},
-                                  time     => $param -> {time},
-                                  dtd      => $param -> {dtd},
-                                  thread   => $tid,
-                                  body     => $param -> {body},
-                                  pars     => $pars});
-
-    save_file ($param -> {messagePath}.$tid.'.xml',\($thread -> toString)) or return $error{threadWrite};
-
-    # Thread eintragen
-    $param -> {parsedThreads}
-           -> {$param -> {lastThread} + 1} = [{mid     => $param -> {lastMessage} + 1,
-                                               unid    => $param -> {uniqueID},
-                                               name    => plain($param -> {author}),
-                                               cat     => plain(length($param -> {category})?$param->{category}:''),
-                                               subject => plain($param -> {subject}),
-                                               time    => plain($param -> {time})}];
-
-    my $forum = create_forum_xml_string ($param -> {parsedThreads},
-                                        {dtd         => $param -> {dtd},
-                                         lastMessage => $mid,
-                                         lastThread  => $tid});
-
-    save_file ($param -> {forumFile}, $forum) or return $error{forumWrite};
-    release_file ($param -> {messagePath}.$tid.'.xml');
-    return (0, $thread, $mid);}
-
-  # Reply
-  else {
-    $tid   = 't'.($param -> {thread});
-    my $tfile = $param -> {messagePath}.$tid.'.xml';
-    my $xml;
-
-    unless (write_lock_file ($tfile)) {
-      violent_unlock_file ($tfile);
-      return $error{threadFile};}
-
-    else {
-      $xml = eval {local $SIG{__DIE__}; new XML::DOM::Parser (KeepCDATA => 1) -> parsefile ($tfile);};
-
-      if ($@) {
-        violent_unlock_file ($tfile) unless (write_unlock_file ($tfile));
-        return $error{threadFile};}
-
-      my $mnode = get_message_node ($xml, $tid, 'm'.$param -> {parentMessage});
-
-      unless (defined $mnode) {
-        violent_unlock_file ($tfile) unless (write_unlock_file ($tfile));
-        return $error{noParent};}
-
-      my $pheader = get_message_header ($mnode);
-
-      my $message = create_message ($xml,
-                                   {msg      => $mid,
-                                    ip       => $param -> {ip},
-                                    name     => $param -> {author},
-                                    email    => $param -> {email},
-                                    home     => $param -> {homepage},
-                                    image    => $param -> {image},
-                                    category => length($param -> {category})?$param -> {category}:$pheader -> {category},
-                                    subject  => length($param -> {subject})?$param -> {subject}:$pheader -> {subject},
-                                    time     => $param -> {time},
-                                    pars     => $pars});
-
-      $mnode -> appendChild ($message);
-
-      my $mcontent = $xml -> createElement ('MessageContent');
-         $mcontent -> setAttribute ('mid', $mid);
-         $mcontent -> appendChild ($xml -> createCDATASection (${encoded_body(\($param -> {body}), $pars)}));
-
-      my $content = $xml -> getElementsByTagName ('ContentList', 1) -> item (0);
-         $content -> appendChild ($mcontent);
-
-      unless (save_file ($tfile, \($xml -> toString))) {
-        violent_unlock_file ($tfile) unless (write_unlock_file ($tfile));
-        return $error{threadWrite};}
-
-      violent_unlock_file ($tfile) unless (write_unlock_file ($tfile));
-
-      $thread = $xml;
-
-      # Message eintragen
-      # ACHTUNG! danach kann der Threadbaum nicht mehr fuer die visuelle
-      # Ausgabe genutzt werden, da die answers nicht angepasst werden
-      # (und somit nicht mehr stimmen...)
-
-      my $i=1;
-      my $cat  = length($param -> {category})?$param -> {category}:$pheader -> {category};
-      my $subj = length($param -> {subject})?$param -> {subject}:$pheader -> {subject};
-
-      for (@{$param -> {parsedThreads} -> {$param -> {thread}}}) {
-        if ($_ -> {mid} == $param -> {parentMessage}) {
-          splice @{$param -> {parsedThreads} -> {$param -> {thread}}},$i,0,
-            {mid     => $param -> {lastMessage} + 1,
-             unid    => $param -> {uniqueID},
-             name    => plain ($param -> {author}),
-             cat     => plain(length($cat)?$cat:''),
-             subject => plain(length($subj)?$subj:''),
-             level   => $_ -> {level} + 1,
-             time    => plain ($param -> {time})};
-          last;}
-        $i++;}
-
-      my $forum = create_forum_xml_string ($param -> {parsedThreads},
-                                          {dtd         => $param -> {dtd},
-                                           lastMessage => $mid,
-                                           lastThread  => 't'.$param -> {lastThread}});
-
-      save_file ($param -> {forumFile}, $forum) or return $error{forumWrite};}
-
-  return (0, $thread, $mid);}
+  my $tid   = 't'.($param -> {lastThread} + 1);
+
+  # define the params needed for a new thread
+  #
+  my $pars = {
+    msg      => $mid,
+    ip       => $param -> {ip},
+    name     => defined $param -> {author}   ? $param -> {author}   : '',
+    email    => defined $param -> {email}    ? $param -> {email}    : '',
+    home     => defined $param -> {homepage} ? $param -> {homepage} : '',
+    image    => defined $param -> {image}    ? $param -> {image}    : '',
+    category => defined $param -> {category} ? $param -> {category} : '',
+    subject  => defined $param -> {subject}  ? $param -> {subject}  : '',
+    body     => encoded_body(
+      \($param -> {body}),
+      { quoteChars => $param -> {quoteChars},
+        messages   => $param -> {messages},
+        base_uri   => $param -> {base_uri}
+      }
+    ),
+    time     => $param -> {time},
+    dtd      => $param -> {dtd},
+    thread   => $tid
+  };
+
+  # create new thread and save it to disk
+  #
+  $thread = create_new_thread ($pars);
+  save_file ($param -> {messagePath}.$tid.'.xml',\($thread -> toString)) or return $error{threadWrite};
+
+  # update forum main file
+  #
+  $param
+    -> {parsedThreads}
+    -> {$param -> {lastThread} + 1} = [
+        { mid     => $param -> {lastMessage} + 1,
+          unid    => $param -> {uniqueID},
+          name    => plain($pars -> {name}),
+          cat     => plain($pars -> {category}),
+          subject => plain($pars -> {subject}),
+          time    => plain($pars -> {time}),
+          level   => 0,
+        }
+       ];
+
+  my $forum = create_forum_xml_string (
+    $param -> {parsedThreads},
+    { dtd         => $pars -> {dtd},
+      lastMessage => $mid,
+      lastThread  => $tid
+    }
+  );
+
+  save_file ($param -> {forumFile}, $forum) or return $error{forumWrite};
+  release_file ($param -> {messagePath}.$tid.'.xml');
+  return (0, $thread, $mid, $tid);