diff --git a/admin/mnet/adminlib.php b/admin/mnet/adminlib.php
index e4da39e..1406706 100644
--- a/admin/mnet/adminlib.php
+++ b/admin/mnet/adminlib.php
@@ -16,28 +16,19 @@
  * type/parentname/docname
  *
  * @param  string   $type           mod, auth or enrol
+ * @param  string   $dir            path to $parentname
  * @param  string   $parentname     Implementation of type, e.g. 'mnet' in the
  *                                  case of auth/mnet/auth.php
  * @return bool                     True on success, else false
  */
-function mnet_get_functions($type, $parentname) {
+function mnet_get_functions($type, $dir, $parentname) {
     global $CFG;
     $dataobject = new stdClass();
-    $docname = $type.'.php';
     $publishes = array();
-    if ('mod' == $type) {
-        $docname = 'rpclib.php';
-        $relname  = '/mod/'.$parentname.'/'.$docname;
-        $filename = $CFG->dirroot.$relname;
-        if (file_exists($filename)) include_once $filename;
-        $mnet_publishes = $parentname.'_mnet_publishes';
-        if (function_exists($mnet_publishes)) {
-            (array)$publishes = $mnet_publishes();
-        }
-    } else {
-        // auth or enrol
-        $relname  = '/'.$type.'/'.$parentname.'/'.$docname;
-        $filename = $CFG->dirroot.$relname;
+    $filename = $CFG->dirroot.'/'.$dir.'/'.$parentname;
+    if ($type == 'auth' || $type == 'enrol') {
+        $docname = $type.'.php';
+        $filename .= '/'.$docname;
         if (file_exists($filename)) include_once $filename;
         $class = $type.($type=='enrol'? 'ment':'').'_plugin_'.$parentname;
         if (class_exists($class)) {
@@ -46,6 +37,15 @@ function mnet_get_functions($type, $parentname) {
                 (array)$publishes = $object->mnet_publishes();
             }
         }
+    } else {
+        $docname = 'rpclib.php';
+        $filename .= '/'.$docname;
+        if (file_exists($filename)) include_once $filename;
+        $prefix = str_replace('/', '_', substr($dir.'/', strlen('mod/')));
+        $mnet_publishes = $prefix.$parentname.'_mnet_publishes';
+        if (function_exists($mnet_publishes)) {
+            (array)$publishes = $mnet_publishes();
+        }
     }
 
     $methodServiceArray = array();
@@ -93,7 +93,7 @@ function mnet_get_functions($type, $parentname) {
         }
 
         $dataobject->function_name = $method;
-        $dataobject->xmlrpc_path   = $type.'/'.$parentname.'/'.$docname.'/'.$method;
+        $dataobject->xmlrpc_path   = $dir.'/'.$parentname.'/'.$docname.'/'.$method;
         $dataobject->parent_type   = $type;
         $dataobject->parent        = $parentname;
         $dataobject->enabled       = '0';
@@ -130,52 +130,30 @@ function mnet_get_functions($type, $parentname) {
 function upgrade_RPC_functions($returnurl) {
     global $CFG;
 
-    $basedir = $CFG->dirroot.'/mod';
-    if (file_exists($basedir) && filetype($basedir) == 'dir') {
-        $dirhandle = opendir($basedir);
-        while (false !== ($dir = readdir($dirhandle))) {
-            $firstchar = substr($dir, 0, 1);
-            if ($firstchar == '.' or $dir == 'CVS' or $dir == '_vti_cnf') {
-                continue;
-            }
-            if (filetype($basedir .'/'. $dir) != 'dir') {
-                continue;
+    $pathlist = array(
+        array('type' => 'mod', 'path' => 'mod'),
+        array('type' => 'resource', 'path' => 'mod/resource/type'),
+        array('type' => 'assignment', 'path' => 'mod/assignment/type'),
+        array('type' => 'auth', 'path' => 'auth'),
+        array('type' => 'enrol', 'path' => 'enrol'),
+    );
+
+    foreach ($pathlist as $p) {
+        $basedir = $CFG->dirroot.'/'.$p['path'];
+
+        if (file_exists($basedir) && filetype($basedir) == 'dir') {
+            $dirhandle = opendir($basedir);
+            while (false !== ($dir = readdir($dirhandle))) {
+                $firstchar = substr($dir, 0, 1);
+                if ($firstchar == '.' or $dir == 'CVS' or $dir == '_vti_cnf') {
+                    continue;
+                }
+                if (filetype($basedir .'/'. $dir) != 'dir') {
+                    continue;
+                }
+
+                mnet_get_functions($p['type'], $p['path'], $dir);
             }
-
-            mnet_get_functions('mod', $dir);
-
-        }
-    }
-
-    $basedir = $CFG->dirroot.'/auth';
-    if (file_exists($basedir) && filetype($basedir) == 'dir') {
-        $dirhandle = opendir($basedir);
-        while (false !== ($dir = readdir($dirhandle))) {
-            $firstchar = substr($dir, 0, 1);
-            if ($firstchar == '.' or $dir == 'CVS' or $dir == '_vti_cnf') {
-                continue;
-            }
-            if (filetype($basedir .'/'. $dir) != 'dir') {
-                continue;
-            }
-
-            mnet_get_functions('auth', $dir);
-        }
-    }
-
-    $basedir = $CFG->dirroot.'/enrol';
-    if (file_exists($basedir) && filetype($basedir) == 'dir') {
-        $dirhandle = opendir($basedir);
-        while (false !== ($dir = readdir($dirhandle))) {
-            $firstchar = substr($dir, 0, 1);
-            if ($firstchar == '.' or $dir == 'CVS' or $dir == '_vti_cnf') {
-                continue;
-            }
-            if (filetype($basedir .'/'. $dir) != 'dir') {
-                continue;
-            }
-
-            mnet_get_functions('enrol', $dir);
         }
     }
 }
diff --git a/lib/db/install.xml b/lib/db/install.xml
index cd2281d..d93fccd 100644
--- a/lib/db/install.xml
+++ b/lib/db/install.xml
@@ -1055,7 +1055,7 @@
         <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" ENUM="false" COMMENT="Unique Function ID" NEXT="function_name"/>
         <FIELD NAME="function_name" TYPE="char" LENGTH="40" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="id" NEXT="xmlrpc_path"/>
         <FIELD NAME="xmlrpc_path" TYPE="char" LENGTH="80" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="function_name" NEXT="parent_type"/>
-        <FIELD NAME="parent_type" TYPE="char" LENGTH="6" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="xmlrpc_path" NEXT="parent"/>
+        <FIELD NAME="parent_type" TYPE="char" LENGTH="20" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="xmlrpc_path" NEXT="parent"/>
         <FIELD NAME="parent" TYPE="char" LENGTH="20" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="parent_type" NEXT="enabled"/>
         <FIELD NAME="enabled" TYPE="int" LENGTH="1" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" ENUM="false" PREVIOUS="parent" NEXT="help"/>
         <FIELD NAME="help" TYPE="text" LENGTH="medium" NOTNULL="true" SEQUENCE="false" ENUM="false" PREVIOUS="enabled" NEXT="profile"/>
@@ -1705,4 +1705,4 @@
       </SENTENCES>
     </STATEMENT>
   </STATEMENTS>
-</XMLDB>
\ No newline at end of file
+</XMLDB>
diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php
index ef6c8ef..ecfa75a 100644
--- a/lib/db/upgrade.php
+++ b/lib/db/upgrade.php
@@ -3169,6 +3169,14 @@ function xmldb_main_upgrade($oldversion=0) {
         upgrade_main_savepoint($result, 2007101547);
     }
 
+    if ($result && $oldversion < 2007101551) {
+        $table = new XMLDBTable('mnet_rpc');
+        $field = new XMLDBField('parent_type');
+        $field->setAttributes(XMLDB_TYPE_CHAR, '20', null, XMLDB_NOTNULL, null, null, null, null, 'xmlrpc_path');
+        $result = $result && change_field_precision($table, $field);
+        upgrade_main_savepoint($result, 2007101551);
+    }
+
     return $result;
 }
 
diff --git a/version.php b/version.php
index cf9fa2a..3a4151c 100644
--- a/version.php
+++ b/version.php
@@ -6,7 +6,7 @@
 // This is compared against the values stored in the database to determine
 // whether upgrades should be performed (see lib/db/*.php)
 
-    $version = 2007101550;  // YYYYMMDD      = date of the 1.9 branch (don't change)
+    $version = 2007101551;  // YYYYMMDD      = date of the 1.9 branch (don't change)
                             //         X     = release number 1.9.[0,1,2,3,4,5...]
                             //          Y.YY = micro-increments between releases
 
