Index: common/db/round.php
===================================================================
--- common/db/round.php	(revision 1093)
+++ common/db/round.php	(working copy)
@@ -83,7 +83,6 @@
     $fields = "round_task.task_id AS id, ".
               "task.`order` AS `order`, ".
               "task.`title` AS `title`, ".
-              "task.`author` AS `author`, ".
               "task.`page_name` AS `page_name`, ".
               "task.`source` AS `source`, ".
               "task.`hidden` AS `hidden`, ".
Index: common/db/user.php
===================================================================
--- common/db/user.php	(revision 1093)
+++ common/db/user.php	(working copy)
@@ -15,7 +15,7 @@
     if (!is_null($user)) {
         log_assert_valid(user_validate($user));
         mem_cache_set("user-by-name:{$user['username']}", $user);
-        mem_cache_set("user-by-id:{$user['username']}", $user);
+        mem_cache_set("user-by-id:{$user['id']}", $user);
     }
     return $user;
 }
@@ -24,7 +24,7 @@
 function _user_cache_delete($user) {
     log_assert_valid(user_validate($user));
     mem_cache_delete("user-by-name:{$user['username']}");
-    mem_cache_delete("user-by-id:{$user['username']}");
+    mem_cache_delete("user-by-id:{$user['id']}");
 }
 
 // Test password in IA1 format.
Index: common/task.php
===================================================================
--- common/task.php	(revision 1093)
+++ common/task.php	(working copy)
@@ -53,10 +53,8 @@
 
     // User stuff. ugly
     if (is_null($user)) {
-        $task['author'] = 'Unknown';
         $task['user_id'] = 0;
     } else {
-        $task['author'] = $user['full_name'];
         $task['user_id'] = $user['id'];
     }
 
Index: scripts/benchmark
===================================================================
--- scripts/benchmark	(revision 1093)
+++ scripts/benchmark	(working copy)
@@ -7,6 +7,7 @@
 
 // URLs to benchmark
 $benchmark_urls = array(
+    IA_URL . "arhiva",
     IA_URL . "utilizator/domino?action=download&file=avatar&resize=L32x32",
     IA_URL . "template/preoni-2006?action=download&file=hlogo.gif",
     IA_URL . "utilizator/domino",
Index: scripts/migrate-authors-to-task-tags
===================================================================
--- scripts/migrate-authors-to-task-tags	(revision 1093)
+++ scripts/migrate-authors-to-task-tags	(working copy)
@@ -108,4 +108,6 @@
     }
 }
 
+db_query("ALTER TABLE ia_task DROP COLUMN author");
+
 ?>
Index: www/controllers/task.php
===================================================================
--- www/controllers/task.php	(revision 1093)
+++ www/controllers/task.php	(working copy)
@@ -144,6 +144,7 @@
         $tags = array();
         if (!$errors) {
             // FIXME: error handling? Is that even remotely possible in php?
+            task_update($new_task);
             task_update_parameters($task_id, $new_task_params);
 
             if (identity_can('task-tag', $new_task)) {
@@ -158,8 +159,7 @@
                         $values['tag_'.$type], $parent);
                 }
             }
-            $new_task["author"] = tag_build_list("task", $new_task["id"], "author");
-            task_update($new_task);
+            mem_cache_delete("task-authors-by-id:".$new_task["id"]);
 
             flash("Task-ul a fost modificat cu succes.");
             redirect(url_task_edit($task_id));
Index: www/controllers/task_tags.php
===================================================================
--- www/controllers/task_tags.php	(revision 1093)
+++ www/controllers/task_tags.php	(working copy)
@@ -113,11 +113,20 @@
     }
 
     $tag["name"] = $new_name;
+    // Check that the new tag doesn't already exist.
     if (tag_get_id($tag)) {
         flash_error("Tagul deja exista.");
         redirect(url_task_tags());
     }
     tag_update_by_id($tag_id, $tag);
+    // Clear author cache for all tasks tagged with the tag.
+    if ($tag["type"] == "author") {
+        $task_ids = tag_get_objects("task", array($tag_id), false);
+        foreach ($task_ids as $task_id) {
+            mem_cache_delete("task-authors-by-id:".$task_id["id"]);
+        }
+    }
+
     flash("Tag-ul a fost redenumit.");
     redirect(url_task_tags());
 }
Index: www/macros/macro_taskparam.php
===================================================================
--- www/macros/macro_taskparam.php	(revision 1093)
+++ www/macros/macro_taskparam.php	(working copy)
@@ -2,7 +2,9 @@
 
 require_once(IA_ROOT_DIR . "common/db/task.php");
 require_once(IA_ROOT_DIR . "common/db/user.php");
-require_once(IA_ROOT_DIR."www/format/format.php");
+require_once(IA_ROOT_DIR . "common/db/tags.php");
+require_once(IA_ROOT_DIR . "common/cache.php");
+require_once(IA_ROOT_DIR . "www/format/format.php");
 
 // Displays a task field, be it a hard-coded field such as task author or a grader parameter such as `timelimit`.
 // NOTE: The macro employs a simple caching mechanism (via static variables, cache expires at the end of the request)
@@ -34,9 +36,6 @@
     }
 
     $task = task_get($task_id);
-    if ($task) {
-        $params = task_get_parameters($task_id);
-    }
 
     // validate task id
     if (!$task) {
@@ -52,7 +51,15 @@
             return html_escape($task['title']);
 
         case 'author':
-            return html_escape($task['author']);
+            $authors = mem_cache_get("task-authors-by-id:".$task["id"]);
+            if ($authors === false) {
+                $authors = tag_get("task", $task["id"], "author");
+                mem_cache_set("task-authors-by-id:".$task["id"], $authors);
+            }
+            function format_author($tag) {
+                return format_link(url_task_search(array($tag["id"])), $tag["name"]);
+            }
+            return implode(", ", array_map('format_author', $authors));
 
         case 'source':
             return html_escape($task['source']);
@@ -79,6 +86,7 @@
                                     $user['rating_cache']);
 
         default:
+            $params = task_get_parameters($task_id);
             if (!isset($params[$param])) {
                 if (isset($args['default_value'])) {
                     return html_escape($args['default_value']);
Index: www/macros/macro_tasks.php
===================================================================
--- www/macros/macro_tasks.php	(revision 1093)
+++ www/macros/macro_tasks.php	(working copy)
@@ -24,6 +24,18 @@
     return $title;
 }
 
+function format_single_author($tag) {
+    return format_link(url_task_search(array($tag["id"])), $tag["name"]);
+}
+function format_author($row) {
+    $authors = mem_cache_get("task-authors-by-id:".$row["id"]);
+    if ($authors === false) {
+        $authors = tag_get("task", $row["id"], "author");
+        mem_cache_set("task-authors-by-id:".$row["id"], $authors);
+    }
+    return implode(", ", array_map('format_single_author', $authors));
+}
+
 function task_row_style($row) {
     $score = getattr($row, 'score');
     if (is_null($score)) {
@@ -145,7 +157,7 @@
         $column_infos[] = array(
                 'title' => 'Autor',
                 'css_class' => 'author',
-                'key' => 'author',
+                'rowform' => 'format_author',
         );
     }
     if ($show_sources) {
Index: www/url.php
===================================================================
--- www/url.php	(revision 1093)
+++ www/url.php	(working copy)
@@ -265,6 +265,11 @@
     return url_complex("admin/sterge-problema");
 }
 
+function url_task_search($tag_ids) {
+    // STUB
+    return "#" . implode("#", array_map('html_escape', $tag_ids));
+}
+
 function url_task_list($page_name, $filter = null) {
     $args = $filter ? array('filtru' => $filter) : array();
     return url_complex($page_name, $args);
Index: www/views/task_tags.php
===================================================================
--- www/views/task_tags.php	(revision 1093)
+++ www/views/task_tags.php	(working copy)
@@ -13,7 +13,10 @@
             "parent" => $row["parent"]
         ),
         $row["name"], "Redenumește");
-    $tag .= ' <a class="algorithm_tag" href="#">' . html_escape($row["name"]) . '</a>';
+    $tag .= ' '.format_link(
+        url_task_search(array($row["id"])), $row["name"], true,
+        array("class" => "algorithm_tag")
+    );
     return $tag;
 }
 
