--- user_types.module.orig	2010-08-12 14:57:22.000000000 +0200
+++ user_types.module	2010-08-12 15:00:34.000000000 +0200
@@ -549,3 +549,60 @@ function user_types_enabled_categories()
   else $categories = array();
   return $categories;
 }
+
+function user_types_enabled_categories_raw($user_id) {
+  global $user;
+  static $categories;
+
+  if (!isset($categories[$user_id])) {
+    $categories[$user_id] = array();
+
+    $query = "SELECT DISTINCT category
+      FROM profile_fields pf INNER JOIN user_types_profile_fields upf ON pf.fid=upf.fid
+      WHERE enabled=1 AND upf.user_type_id=%d";
+
+    $user_type_id = user_types_user_user_type_id($user_id);
+
+    $result = db_query($query, $user_type_id);
+
+    while ($category = db_result($result)) {
+      $categories[$user_id][] = $category;
+    }
+  }
+
+  return $categories[$user_id];
+}
+
+/**
+* Implementation of hook_menu_alter().
+*/
+function user_types_menu_alter(&$callbacks) {
+  $result = db_query('SELECT DISTINCT(category)
+                      FROM {profile_fields}');
+
+  while ($category = db_result($result)) {
+    $key = 'user/%user_category/edit/' . $category;
+    $callbacks[$key]['access callback'] = 'user_types_access_category';
+    $callbacks[$key]['access arguments'] = array(1, $category);
+  }
+}
+
+/**
+* Access callback -- ensure that the user being editted is of a type that
+* uses the field category, if so then ensure that the editting user has
+* permission to edit the fields.
+*
+* @param object $user User being editted.
+* @param string $category Profile field category.
+* @return boolean Access.
+*/
+function user_types_access_category($user, $category) {
+  $enabled_categories = user_types_enabled_categories_raw($user->uid);
+
+  if (!in_array($category, $enabled_categories)) {
+    return FALSE;
+  }
+  else {
+    return user_edit_access($user);
+  }
+}
