If you set node creation permission (Node Module on `www.yourhost.com/admin/user/permissions`) to specific roles, the existing form should take care of this automagically by itself, eg, if the user accessing `www.yourhost.com/node/add` can't create a specific node type, it won't be presented on that page. Based upon commentary, `node/add` is built via: function node_add_page() { $item = menu_get_item(); $content = system_admin_menu_block($item); return theme('node_add_list', $content); } /** * Display the list of available node types for node creation. * * @ingroup themeable */ function theme_node_add_list($content) { $output = ''; if ($content) { $output = '<dl class="node-type-list">'; foreach ($content as $item) { $output .= '<dt>'. l($item['title'], $item['href'], $item['localized_options']) .'</dt>'; $output .= '<dd>'. filter_xss_admin($item['description']) .'</dd>'; } $output .= '</dl>'; } return $output; } so you most certainly could create a new `YOURTHEME_node_add_list()` function that filters the links based upon a user's role realizing that if the user entered the link directly it would nonetheless still work. You could also create a `node-add-list.tpl.php` in your theme's directory with basically this in it as a start: <?php $output=''; if ($content) { $output = '<dl class="node-type-list lrfm-ed">'; foreach ($content as $item) { $output .= '<dt>'. l($item['title'], $item['href'], $item['localized_options']) .'</dt>'; $output .= '<dd>'. filter_xss_admin($item['description']) .'</dd>'; } $output .= '</dl>'; } print $output; and then modify it however you wanted. Just flush caches after either to make drupal's theme system see and pick up the changes.