diff -urN ../plupload-orig/modules/plupload_core/plupload_core.info plupload/modules/plupload_core/plupload_core.info
--- ../plupload-orig/modules/plupload_core/plupload_core.info	1969-12-31 19:00:00.000000000 -0500
+++ plupload/modules/plupload_core/plupload_core.info	2011-09-30 18:06:18.000000000 -0400
@@ -0,0 +1,5 @@
+name = Plupload Node Upload Support
+description = Replaces the node "File Attachments" form (provided by Drupal Core's Upload module) with a file upload widget provided by the Plupload library.
+dependencies[] = plupload
+dependencies[] = upload
+core = 6.x
diff -urN ../plupload-orig/modules/plupload_core/plupload_core.module plupload/modules/plupload_core/plupload_core.module
--- ../plupload-orig/modules/plupload_core/plupload_core.module	1969-12-31 19:00:00.000000000 -0500
+++ plupload/modules/plupload_core/plupload_core.module	2011-10-03 00:22:54.000000000 -0400
@@ -0,0 +1,173 @@
+<?php
+
+/**
+ * Implementation of hook_menu().
+ */
+function plupload_core_menu() {
+  $items['node/%/plupload-core-upload'] = array(
+    'title' => 'Upload files',
+    'page callback' => 'plupload_core_upload',
+    'page arguments' => array(1),
+    'access callback' => 'user_access',
+    'access arguments' => array('bulk upload files with plupload'),
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Menu callback.
+ */
+function plupload_core_upload($nid) {
+  if (!user_access('upload files'))
+    drupal_access_denied();
+
+  $temp_directory = file_directory_temp();
+  
+  $file_name = plupload_receive_chunks($temp_directory);
+
+  if ($nid !== '0') {
+    $node = node_load($nid);
+    if (!node_access('update', $node))
+      drupal_access_denied();
+  }
+
+  if ($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;
+    file_set_status($file, FILE_STATUS_PERMANENT);
+
+    $cached_form_state = array();
+    $cached_form = form_get_cache($_GET['form_build_id'], $cached_form_state);
+    $cached_form_state = cache_get(plupload_core_get_attachmentstate_key());
+    $cached_form_state = $cached_form_state->data;
+
+    $node = $cached_form['#node'];
+
+    $cached_form['#node']->files[$file->fid] = $file;
+    $cached_form_state['values']['files'][$file->fid] = $file;
+    $cached_form_state['values']['files'][$file->fid]->new = TRUE;
+
+    // build the standard form containing the list of file attachments and upload widget
+    $form = _upload_form($node);
+
+    // ...and remove the standard upload widget
+    unset($form['new']);
+
+    unset($cached_form['attachments']['wrapper']['new']);
+    $cached_form['attachments']['wrapper'] = array_merge($cached_form['attachments']['wrapper'], $form);
+
+    $cached_form['attachments']['#collapsed'] = FALSE;
+
+    form_set_cache($_GET['form_build_id'], $cached_form, $cached_form_state);
+
+    // store the attachment attributes to the database (since we can't pass them in $_POST like core upload does)
+    cache_set(plupload_core_get_attachmentstate_key(), $cached_form_state, 'cache', CACHE_TEMPORARY);
+  }
+  file_delete($temp_directory . DIRECTORY_SEPARATOR . $file_name);
+
+  foreach ($node->files as $fid => $file) {
+    if (is_numeric($fid)) {
+      $form['files'][$fid]['description']['#default_value'] = $cached_form_state['values']['files'][$fid]->description;
+      $form['files'][$fid]['list']['#default_value'] = !empty($cached_form_state['values']['files'][$fid]->list);
+      $form['files'][$fid]['remove']['#default_value'] = !empty($cached_form_state['values']['files'][$fid]->remove);
+      $form['files'][$fid]['weight']['#default_value'] = $cached_form_state['values']['files'][$fid]->weight;
+    }
+  }
+
+  // Render the form for output.
+  $form += array(
+    '#post' => $_POST,
+    '#programmed' => FALSE,
+    '#tree' => FALSE,
+    '#parents' => array(),
+  );
+  drupal_alter('form', $form, array(), 'plupload_core_upload');
+  $form_state = array('submitted' => FALSE);
+  $form = form_builder('plupload_core_upload', $form, $form_state);
+  $output = theme('status_messages') . drupal_render($form);
+  $output .= plupload_core_get_html();
+
+  // Return JSON-RPC response
+  die(drupal_to_js(array(
+    "jsonrpc" => "2.0",
+    "result" => $output,
+    "id" => "id"
+  )));
+}
+
+/**
+ * Implementation of hook_theme_registry_alter().
+ */
+function plupload_core_theme_registry_alter(&$theme_registry) {
+  if (!empty($theme_registry['upload_form_new'])) {
+    $theme_registry['upload_form_new']['function'] = 'plupload_core_upload_form_new';
+  }
+}
+
+/**
+ * Return a rendered Pluploader widget, configured for the current user.
+ */
+function plupload_core_get_html()
+{
+  global $user;
+  $limits = _upload_file_limits($user);
+
+  $js_dir = plupload_includes();
+
+  $extensions = str_replace(' ', ',', $limits['extensions']);
+  $url = url('node/' . (arg(1)==='add'?0:arg(1)) . '/plupload-core-upload');
+  $swfurl = url('') . $js_dir .'/plupload.flash.swf';
+
+  $settings = array();
+  $settings['plupload'] = array(
+    'url' => $url,
+    'swfurl' => $swfurl,
+    'extensions' => $extensions,
+    'multiple_queues' => 'yes',
+  );
+  drupal_add_js($settings, 'setting');
+   
+  return theme('plupload_uploader');
+}
+
+/**
+ * Generate a unique key for storing our form's work-in-progress attachment metadata.
+ * (We can't just use form_build_id, since it might not exist yet.)
+ */
+function plupload_core_get_attachmentstate_key() {
+  global $user;
+  return 'plupload_core_nid' . (arg(1)==='add'?0:arg(1)) . '_uid' . $user->uid . '_attachmentstate';
+}
+
+/**
+ * Replace the default new-attachment form with our own.
+ */
+function plupload_core_upload_form_new($form) {
+  drupal_add_tabledrag('upload-attachments', 'order', 'sibling', 'upload-weight');
+  unset($form['new']);
+
+  $attachmentstate=cache_get(plupload_core_get_attachmentstate_key());
+
+  if(!$attachmentstate->data && arg(1)!=='add') {
+    $node = node_load(arg(1));
+    // store the initial attachment attributes to the database (since we're not passing them in $_POST)
+    cache_set(plupload_core_get_attachmentstate_key(), array('values'=>array('files'=>(array)$node->files)), 'cache', CACHE_TEMPORARY);
+  }
+
+  $output = drupal_render($form);
+
+  $output .= plupload_core_get_html();
+  return $output;
+}
+
+
+function plupload_core_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
+  switch ($op) {
+    case 'update':
+      cache_set(plupload_core_get_attachmentstate_key(), NULL, 'cache', CACHE_TEMPORARY);
+      break;
+  }
+}
\ No newline at end of file
diff -urN ../plupload-orig/plupload.js plupload/plupload.js
--- ../plupload-orig/plupload.js	2011-09-28 18:24:26.000000000 -0400
+++ plupload/plupload.js	2011-10-03 00:23:56.000000000 -0400
@@ -5,7 +5,8 @@
   $("#uploader").pluploadQueue({
     // General settings
     runtimes : 'html5,flash,html4',
-    url : Drupal.settings.plupload.url,
+    url : Drupal.settings.plupload.url+"?form_build_id="+$('input[name=form_build_id]').val(),
+    multiple_queues : Drupal.settings.plupload.multiple_queues,
     max_file_size : '10mb',
     chunk_size : '1mb',
     unique_names : false,
@@ -13,7 +14,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,8 +28,11 @@
       
       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.');
       
+      var response = jQuery.parseJSON(res.response);
+      $('#attach-wrapper').html(response.result);
+      Drupal.attachBehaviors($('#attach-wrapper'));
       
       $('div.plupload_header').slideUp('slow', function() {
         $('div.plupload_header').html('<h3>'+ successText +'</h3>').slideDown('slow');
diff -urN ../plupload-orig/plupload.module plupload/plupload.module
--- ../plupload-orig/plupload.module	2011-09-28 18:24:26.000000000 -0400
+++ plupload/plupload.module	2011-10-03 00:25:01.000000000 -0400
@@ -79,9 +79,9 @@
 }
 
 /**
- * Page callback for the bulk uploader.
+ * Register the necessary JS and CSS files for this page render.
  */
-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 +103,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 +147,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 +219,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();
