diff --git a/root/language/en/mods/portal/portal_random_member_module.php b/root/language/en/mods/portal/portal_random_member_module.php
new file mode 100644
index 00000000..02b38124
--- /dev/null
+++ b/root/language/en/mods/portal/portal_random_member_module.php
@@ -0,0 +1,42 @@
+ 'Random member',
+ 'RND_JOIN' => 'Join',
+ 'RND_POSTS' => 'Posts',
+ 'RND_OCC' => 'Occupation',
+ 'RND_FROM' => 'Location',
+ 'RND_WWW' => 'Web page',
+));
+
+?>
\ No newline at end of file
diff --git a/root/portal/modules/portal_random_member.php b/root/portal/modules/portal_random_member.php
new file mode 100644
index 00000000..5f02c477
--- /dev/null
+++ b/root/portal/modules/portal_random_member.php
@@ -0,0 +1,143 @@
+lang}/mods/portal/"
+ */
+ var $language = 'portal_random_member_module';
+
+ /**
+ * custom acp template
+ * file must be in "adm/style/portal/"
+ */
+ var $custom_acp_tpl = '';
+
+ function get_template_side($module_id)
+ {
+ global $config, $template, $db, $user;
+
+ switch ($db->sql_layer)
+ {
+ case 'postgres':
+ $sql = 'SELECT *
+ FROM ' . USERS_TABLE . '
+ WHERE user_type <> ' . USER_IGNORE . '
+ AND user_type <> ' . USER_INACTIVE . '
+ ORDER BY RANDOM()';
+ break;
+
+ case 'mssql':
+ case 'mssql_odbc':
+ $sql = 'SELECT *
+ FROM ' . USERS_TABLE . '
+ WHERE user_type <> ' . USER_IGNORE . '
+ AND user_type <> ' . USER_INACTIVE . '
+ ORDER BY NEWID()';
+ break;
+
+ default:
+ $sql = 'SELECT *
+ FROM ' . USERS_TABLE . '
+ WHERE user_type <> ' . USER_IGNORE . '
+ AND user_type <> ' . USER_INACTIVE . '
+ ORDER BY RAND()';
+ break;
+ }
+
+ $result = $db->sql_query_limit($sql, 1);
+ $row = $db->sql_fetchrow($result);
+
+ $avatar_img = get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']);
+
+ $rank_title = $rank_img = '';
+ get_user_rank($row['user_rank'], $row['user_posts'], $rank_title, $rank_img, $rank_img_src);
+
+ $username = $row['username'];
+ $user_id = (int) $row['user_id'];
+ $colour = $row['user_colour'];
+
+ $template->assign_block_vars('random_member', array(
+ 'USERNAME_FULL' => get_username_string('full', $user_id, $username, $colour),
+ 'USERNAME' => get_username_string('username', $user_id, $username, $colour),
+ 'USER_COLOR' => get_username_string('colour', $user_id, $username, $colour),
+ 'U_VIEW_PROFILE' => get_username_string('profile', $user_id, $username, $colour),
+
+ 'RANK_TITLE' => $rank_title,
+ 'RANK_IMG' => $rank_img,
+ 'RANK_IMG_SRC' => $rank_img_src,
+
+ 'USER_POSTS' => (int) $row['user_posts'],
+ 'AVATAR_IMG' => $avatar_img,
+ 'JOINED' => $user->format_date($row['user_regdate'], 'd.M.Y'),
+ 'USER_OCC' => censor_text($row['user_occ']),
+ 'USER_FROM' => censor_text($row['user_from']),
+ 'U_WWW' => censor_text($row['user_website']),
+ ));
+ $db->sql_freeresult($result);
+
+ return 'random_member_side.html';
+ }
+
+ function get_template_acp($module_id)
+ {
+ return array(
+ 'title' => 'PORTAL_RANDOM_MEMBER',
+ 'vars' => array(),
+ );
+ }
+
+ /**
+ * API functions
+ */
+ function install($module_id)
+ {
+ return true;
+ }
+
+ function uninstall($module_id)
+ {
+ return true;
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/root/styles/prosilver/template/portal/modules/random_member_side.html b/root/styles/prosilver/template/portal/modules/random_member_side.html
new file mode 100644
index 00000000..ae6d732e
--- /dev/null
+++ b/root/styles/prosilver/template/portal/modules/random_member_side.html
@@ -0,0 +1,22 @@
+
+{$LR_BLOCK_H_L} {L_PORTAL_RANDOM_MEMBER}{$LR_BLOCK_H_R}
+
+