diff --git a/modules/user.module b/modules/user.module
index 2fc62298faa395709d854917c9117c7ca4232afb..c559868ba629260e0939f5f11c6ba5114c3d5bf4 100644
--- a/modules/user.module
+++ b/modules/user.module
@@ -40,7 +40,7 @@ function user_external_load($authname) {
  *   user, such as user name or email address.
  *
  * @return
- *   A fully-loaded $user object.
+ *   A fully-loaded $user object upon successful user load or FALSE if user cannot be loaded.
  */
 function user_load($array = array()) {
   // Dynamically compose a SQL query:
@@ -75,7 +75,7 @@ function user_load($array = array()) {
     user_module_invoke('load', $array, $user);
   }
   else {
-    $user = new StdClass();
+    $user = FALSE;
   }
 
   return $user;
@@ -747,27 +747,32 @@ function user_menu($may_cache) {
   }
   else {
     if (arg(0) == 'user' && is_numeric(arg(1))) {
+      $user_exists = user_load(array('uid' => arg(1), 'status' => 1));
+
       $items[] = array('path' => 'user/'. arg(1), 'title' => t('user'),
         'type' => MENU_CALLBACK, 'callback' => 'user_view',
         'callback arguments' => arg(1), 'access' => $view_access);
-      $items[] = array('path' => 'user/'. arg(1) .'/view', 'title' => t('view'),
-        'access' => $view_access, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
-      $items[] = array('path' => 'user/'. arg(1) .'/edit', 'title' => t('edit'),
-        'callback' => 'user_edit', 'access' => $admin_access || $user->uid == arg(1),
-        'type' => MENU_LOCAL_TASK);
-      $items[] = array('path' => 'user/'. arg(1) .'/delete', 'title' => t('delete'),
-        'callback' => 'user_edit', 'access' => $admin_access,
-        'type' => MENU_CALLBACK);
-
-      if (arg(2) == 'edit') {
-        if (($categories = _user_categories()) && (count($categories) > 1)) {
-          foreach ($categories as $key => $category) {
-            $items[] = array(
-              'path' => 'user/'. arg(1) .'/edit/'. $category['name'],
-              'title' => $category['title'],
-              'type' => $category['name'] == 'account' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
-              'weight' => $category['weight'],
-              'access' => ($admin_access || $user->uid == arg(1)));
+
+      if ($user_exists !== FALSE) {
+        $items[] = array('path' => 'user/'. arg(1) .'/view', 'title' => t('view'),
+          'access' => $view_access, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
+        $items[] = array('path' => 'user/'. arg(1) .'/edit', 'title' => t('edit'),
+          'callback' => 'user_edit', 'access' => $admin_access || $user->uid == arg(1),
+          'type' => MENU_LOCAL_TASK);
+        $items[] = array('path' => 'user/'. arg(1) .'/delete', 'title' => t('delete'),
+          'callback' => 'user_edit', 'access' => $admin_access,
+          'type' => MENU_CALLBACK);
+
+        if (arg(2) == 'edit') {
+          if (($categories = _user_categories()) && (count($categories) > 1)) {
+            foreach ($categories as $key => $category) {
+              $items[] = array(
+                'path' => 'user/'. arg(1) .'/edit/'. $category['name'],
+                'title' => $category['title'],
+                'type' => $category['name'] == 'account' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
+                'weight' => $category['weight'],
+                'access' => ($admin_access || $user->uid == arg(1)));
+            }
           }
         }
       }
@@ -1258,6 +1263,7 @@ function user_edit($category = 'account') {
       db_query('DELETE FROM {sessions} WHERE uid = %d', $account->uid);
       db_query('DELETE FROM {users_roles} WHERE uid = %d', $account->uid);
       db_query('DELETE FROM {authmap} WHERE uid = %d', $account->uid);
+      watchdog('user', t('Deleted user: %name %email.', array('%name' => theme('placeholder', $account->name), '%email' => theme('placeholder', '<'. $account->mail .'>'))), WATCHDOG_NOTICE);
       drupal_set_message(t('The account has been deleted.'));
       module_invoke_all('user', 'delete', $edit, $account);
       drupal_goto('admin/user');
@@ -1267,8 +1273,12 @@ function user_edit($category = 'account') {
     }
   }
   else if ($_POST['op'] == t('Delete')) {
+    if ($_REQUEST['destination']) {
+      $destination = drupal_get_destination();
+      unset($_REQUEST['destination']);
+    }
     // Note: we redirect from user/uid/edit to user/uid/delete to make the tabs disappear.
-    drupal_goto("user/$account->uid/delete");
+    drupal_goto("user/$account->uid/delete", $destination);
   }
 
   $form = _user_forms($edit, $account, $category);
@@ -1757,13 +1767,12 @@ function user_admin_account() {
   $result = pager_query($sql, 50);
 
   $status = array(t('blocked'), t('active'));
-  $destination = drupal_get_destination();
   while ($account = db_fetch_object($result)) {
     $rows[] = array(theme('username', $account),
                     $status[$account->status],
                     format_interval(time() - $account->created),
                     $account->access ? t('%time ago', array('%time' => format_interval(time() - $account->access))) : t('never'),
-                    l(t('edit'), "user/$account->uid/edit", array(), $destination));
+                    l(t('edit'), "user/$account->uid/edit", array()));
   }
 
   $output = theme('table', $header, $rows);
diff --git a/modules/user/user.module b/modules/user/user.module
index 2fc62298faa395709d854917c9117c7ca4232afb..c559868ba629260e0939f5f11c6ba5114c3d5bf4 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -40,7 +40,7 @@ function user_external_load($authname) {
  *   user, such as user name or email address.
  *
  * @return
- *   A fully-loaded $user object.
+ *   A fully-loaded $user object upon successful user load or FALSE if user cannot be loaded.
  */
 function user_load($array = array()) {
   // Dynamically compose a SQL query:
@@ -75,7 +75,7 @@ function user_load($array = array()) {
     user_module_invoke('load', $array, $user);
   }
   else {
-    $user = new StdClass();
+    $user = FALSE;
   }
 
   return $user;
@@ -747,27 +747,32 @@ function user_menu($may_cache) {
   }
   else {
     if (arg(0) == 'user' && is_numeric(arg(1))) {
+      $user_exists = user_load(array('uid' => arg(1), 'status' => 1));
+
       $items[] = array('path' => 'user/'. arg(1), 'title' => t('user'),
         'type' => MENU_CALLBACK, 'callback' => 'user_view',
         'callback arguments' => arg(1), 'access' => $view_access);
-      $items[] = array('path' => 'user/'. arg(1) .'/view', 'title' => t('view'),
-        'access' => $view_access, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
-      $items[] = array('path' => 'user/'. arg(1) .'/edit', 'title' => t('edit'),
-        'callback' => 'user_edit', 'access' => $admin_access || $user->uid == arg(1),
-        'type' => MENU_LOCAL_TASK);
-      $items[] = array('path' => 'user/'. arg(1) .'/delete', 'title' => t('delete'),
-        'callback' => 'user_edit', 'access' => $admin_access,
-        'type' => MENU_CALLBACK);
-
-      if (arg(2) == 'edit') {
-        if (($categories = _user_categories()) && (count($categories) > 1)) {
-          foreach ($categories as $key => $category) {
-            $items[] = array(
-              'path' => 'user/'. arg(1) .'/edit/'. $category['name'],
-              'title' => $category['title'],
-              'type' => $category['name'] == 'account' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
-              'weight' => $category['weight'],
-              'access' => ($admin_access || $user->uid == arg(1)));
+
+      if ($user_exists !== FALSE) {
+        $items[] = array('path' => 'user/'. arg(1) .'/view', 'title' => t('view'),
+          'access' => $view_access, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
+        $items[] = array('path' => 'user/'. arg(1) .'/edit', 'title' => t('edit'),
+          'callback' => 'user_edit', 'access' => $admin_access || $user->uid == arg(1),
+          'type' => MENU_LOCAL_TASK);
+        $items[] = array('path' => 'user/'. arg(1) .'/delete', 'title' => t('delete'),
+          'callback' => 'user_edit', 'access' => $admin_access,
+          'type' => MENU_CALLBACK);
+
+        if (arg(2) == 'edit') {
+          if (($categories = _user_categories()) && (count($categories) > 1)) {
+            foreach ($categories as $key => $category) {
+              $items[] = array(
+                'path' => 'user/'. arg(1) .'/edit/'. $category['name'],
+                'title' => $category['title'],
+                'type' => $category['name'] == 'account' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
+                'weight' => $category['weight'],
+                'access' => ($admin_access || $user->uid == arg(1)));
+            }
           }
         }
       }
@@ -1258,6 +1263,7 @@ function user_edit($category = 'account') {
       db_query('DELETE FROM {sessions} WHERE uid = %d', $account->uid);
       db_query('DELETE FROM {users_roles} WHERE uid = %d', $account->uid);
       db_query('DELETE FROM {authmap} WHERE uid = %d', $account->uid);
+      watchdog('user', t('Deleted user: %name %email.', array('%name' => theme('placeholder', $account->name), '%email' => theme('placeholder', '<'. $account->mail .'>'))), WATCHDOG_NOTICE);
       drupal_set_message(t('The account has been deleted.'));
       module_invoke_all('user', 'delete', $edit, $account);
       drupal_goto('admin/user');
@@ -1267,8 +1273,12 @@ function user_edit($category = 'account') {
     }
   }
   else if ($_POST['op'] == t('Delete')) {
+    if ($_REQUEST['destination']) {
+      $destination = drupal_get_destination();
+      unset($_REQUEST['destination']);
+    }
     // Note: we redirect from user/uid/edit to user/uid/delete to make the tabs disappear.
-    drupal_goto("user/$account->uid/delete");
+    drupal_goto("user/$account->uid/delete", $destination);
   }
 
   $form = _user_forms($edit, $account, $category);
@@ -1757,13 +1767,12 @@ function user_admin_account() {
   $result = pager_query($sql, 50);
 
   $status = array(t('blocked'), t('active'));
-  $destination = drupal_get_destination();
   while ($account = db_fetch_object($result)) {
     $rows[] = array(theme('username', $account),
                     $status[$account->status],
                     format_interval(time() - $account->created),
                     $account->access ? t('%time ago', array('%time' => format_interval(time() - $account->access))) : t('never'),
-                    l(t('edit'), "user/$account->uid/edit", array(), $destination));
+                    l(t('edit'), "user/$account->uid/edit", array()));
   }
 
   $output = theme('table', $header, $rows);