diff -ur ../plupload-orig/plupload.js plupload/plupload.js
--- ../plupload-orig/plupload.js	2011-09-28 18:24:26.000000000 -0400
+++ plupload/plupload.js	2011-09-28 23:58:09.000000000 -0400
@@ -13,7 +13,7 @@
 
     // Specify what files to browse for
     filters : [
-      {title : "Image files", extensions : Drupal.settings.plupload.extensions}
+      {title : "Upload files", extensions : Drupal.settings.plupload.extensions}
     ]
    });
 };
@@ -27,7 +27,7 @@
       
       var count = $('#uploader').pluploadQueue().total.uploaded;
       
-      var successText = Drupal.formatPlural(count, 'Success! 1 image uploaded.', 'Success! @count images uploaded.');
+      var successText = Drupal.formatPlural(count, 'Success! 1 file uploaded.', 'Success! @count files uploaded.');
       
       
       $('div.plupload_header').slideUp('slow', function() {
diff -ur ../plupload-orig/plupload.module plupload/plupload.module
--- ../plupload-orig/plupload.module	2011-09-28 18:24:26.000000000 -0400
+++ plupload/plupload.module	2011-09-29 01:58:33.000000000 -0400
@@ -25,6 +25,15 @@
     'access arguments' => array('bulk upload files with plupload'),
     'type' => MENU_CALLBACK,
   );
+  $items['plupload-upload-to-existing-node'] = array(
+    'title' => 'Upload files',
+    'page callback' => 'plupload_upload_to_existing_node',
+    'page arguments' => array(1),
+    'access callback' => 'user_access',
+    'access arguments' => array('bulk upload files with plupload'),
+    'type' => MENU_CALLBACK,
+  );
+  
   $items['file-plupload'] = array(
     'title' => 'Upload files',
     'page callback' => 'plupload_upload_page',
@@ -78,10 +87,7 @@
   return system_settings_form($form);
 }
 
-/**
- * Page callback for the bulk uploader.
- */
-function plupload_upload_page($options = array()) {
+function plupload_includes() {
   $path = plupload_library_path();
   // Plupload changed their distro file structure starting with version 1.4.3, but the github repo still uses the old structure
   // Also, instead of including separate minified js files, all js files in a release are minified.  Only github source is non-minified
@@ -103,6 +109,15 @@
   drupal_add_js($queue_dir . '/jquery.plupload.queue.js');
   drupal_add_js($js_dir . '/plupload.flash.js');
   drupal_add_css($css_file);
+  return $js_dir;
+}
+
+/**
+ * Page callback for the bulk uploader.
+ */
+function plupload_upload_page($options = array()) {
+  $js_dir = plupload_includes();
+
   $query_string = $_GET;
   unset($query_string['q']);
   // In case we're not being called via hook_menu, we allow other contrib modules to add query string options
@@ -138,9 +153,8 @@
   return $output;
 }
 
-function plupload_pernode() {
-  $temp_directory = file_directory_temp();
 
+function plupload_receive_chunks($temp_directory) {
   // Chunk it?
   $chunk = isset($_REQUEST["chunk"]) ? $_REQUEST["chunk"] : 0;
   $chunks = isset($_REQUEST["chunks"]) ? $_REQUEST["chunks"] : 0;
@@ -211,9 +225,16 @@
     // Don't move the file and add the node yet, we have more chunks coming
     die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');
   }
+  
+  // If we make it here, we have a complete file.
+  return $file_name;
+}
 
-  // Move it to it's final home.
-  $path = file_directory_path();
+
+function plupload_pernode() {
+  $temp_directory = file_directory_temp();
+  
+  $file_name = plupload_receive_chunks($temp_directory);
 
   // Pull off all the options from the query string for later attachment to the node.
   $options = array();
@@ -233,6 +254,31 @@
 }
 
 
+function plupload_upload_to_existing_node($nid) {
+  $node = node_load($nid);
+  if (!node_access('update', $node)) {
+    drupal_access_denied();
+  }
+
+  $temp_directory = file_directory_temp();
+  
+  $file_name = plupload_receive_chunks($temp_directory);
+
+  if (user_access('upload files') && $file = (object)field_file_save_file($temp_directory . DIRECTORY_SEPARATOR . $file_name, array(), file_directory_path())) {
+    $file->list = variable_get('upload_list_default', 1);
+    $file->description = $file->filename;
+    $file->weight = 0;
+    $file->new = TRUE;
+    $node->files[$file->fid] = $file;
+    node_save($node);
+  }
+  file_delete($temp_directory . DIRECTORY_SEPARATOR . $file_name);
+
+  // Return JSON-RPC response
+  die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');
+}
+
+
 /**
  * Helper wrapper around the cck code to create a node of this type.
  * Largely copied from imagefield_import.module
@@ -411,3 +457,42 @@
   drupal_add_js($path .'/plupload.js');
   return '<div id="uploader">Your browser does not support HTML5 native or flash upload. Try Firefox 3, Safari 4, or Chrome; or install Flash.</div>';
 }
+
+/**
+ * Implementation of hook_theme_registry_alter().
+ */
+function plupload_theme_registry_alter(&$theme_registry) {
+  if (!empty($theme_registry['upload_form_new'])) {
+    $theme_registry['upload_form_new']['function'] = 'plupload_upload_form_new';
+  }
+}
+
+function plupload_upload_form_new($form) {
+  if (arg(0) !== 'node' || !is_numeric(arg(1)))
+    return '';
+
+  drupal_add_tabledrag('upload-attachments', 'order', 'sibling', 'upload-weight');
+  unset($form['new']);
+  $output = drupal_render($form);
+
+  global $user;
+  $limits = _upload_file_limits($user);
+
+  $js_dir = plupload_includes();
+
+  $extensions = str_replace(' ', ',', $limits['extensions']);
+  $url = url('plupload-upload-to-existing-node/'. arg(1));
+  $swfurl = url('') . $js_dir .'/plupload.flash.swf';
+
+  $settings = array();
+  $settings['plupload'] = array (
+    'url' => $url,
+    'swfurl' => $swfurl,
+    'extensions' => $extensions
+  );
+
+  drupal_add_js($settings, 'setting');
+   
+  $output .= theme('plupload_uploader');
+  return $output;
+}
