diff --git a/resources/file_resource.inc b/resources/file_resource.inc
index 75d05dc..3fa87fd 100644
--- a/resources/file_resource.inc
+++ b/resources/file_resource.inc
@@ -15,7 +15,7 @@ function _file_resource_definition() {
     'file' => array(
       'create' => array(
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/file_resource'),
-        'help' => 'Creates a file',
+        'help' => 'Creates a file with base64 encoded data',
         'callback' => '_file_resource_create',
         'access callback' => '_file_resource_access',
         'access arguments' => array('create'),
@@ -75,6 +75,7 @@ function _file_resource_definition() {
       'index' => array(
         'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/file_resource'),
         'callback' => '_file_resource_index',
+        'help' => 'Lists all files',
         'args' => array(
           array(
             'name' => 'page',
@@ -113,6 +114,16 @@ function _file_resource_definition() {
         'access arguments' => array('index'),
         'access arguments append' => TRUE,
       ),
+      'actions' => array(
+        'create_raw' => array(
+          'help' => 'Creates a file with raw data.',
+          'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/file_resource'),
+          'callback' => '_file_resource_create_raw',
+          'access callback' => '_file_resource_access',
+          'access arguments' => array('create_raw'),
+          'access arguments append' => TRUE,
+        ),
+      ),
     ),
   );
 }
@@ -158,7 +169,7 @@ function _file_resource_index($page, $fields, $parameters, $page_size) {
  * Adds a new file and returns the fid.
  *
  * @param $file
- *   An array as representing the file.
+ *   An array as representing the file with data base64 encoded in $file->file.
  * @return
  *   Unique identifier for the file (fid) or errors if there was a problem.
  */
@@ -249,7 +260,33 @@ function _file_resource_create($file) {
     'uri' => services_resource_uri(array('file', $file['fid'])),
   );
 }
-
+/**
+ * Adds new files and returns the files array.
+ *
+ * @return
+ *   Array of file objects with URIS to access them
+ */
+function _file_resource_create_raw() {
+  $validators = array(
+    'file_validate_extensions' => array(),
+    'file_validate_size' => array(),
+  );
+  $files = array();
+  foreach ($_FILES['files']['name'] as $field_name => $file_name) {
+    $file = file_save_upload($field_name, $validators, file_directory_path());
+    // Required to be able to reference this file.
+    if ($file->fid) {
+      $files[] = array(
+        'fid' => $file->fid,
+        'uri' => services_resource_uri(array('file', $file->fid)),
+      ); 
+    } 
+    else {
+      return services_error(t('An unknown error occured', 500));
+    }
+  }
+  return $files;
+}
 /**
  * Get a given file
  *
@@ -359,6 +396,9 @@ function _file_resource_access($op = 'view', $args = array()) {
       return $file->uid == $user->uid && user_access('get own binary files');
       break;
     case 'create':
+    case 'create_raw':
+      return user_access('save file information');
+      break;
     case 'delete':
       return $file->uid == $user->uid && user_access('save file information');
       break;
diff --git a/servers/rest_server/includes/RESTServer.inc b/servers/rest_server/includes/RESTServer.inc
index 5896c0b..0ecfbba 100755
--- a/servers/rest_server/includes/RESTServer.inc
+++ b/servers/rest_server/includes/RESTServer.inc
@@ -565,4 +565,4 @@ class RESTServer {
       return $action;
     }
   }
-}
\ No newline at end of file
+}
diff --git a/tests/functional/ServicesResourceFileTests.test b/tests/functional/ServicesResourceFileTests.test
index 69c3d6e..d90f312 100644
--- a/tests/functional/ServicesResourceFileTests.test
+++ b/tests/functional/ServicesResourceFileTests.test
@@ -123,7 +123,18 @@ class ServicesResourceFileTests extends ServicesWebTestCase {
     $this->assertTrue($file1->filename != $file2->filename && $file1->filepath != $file2->filepath,
       t('Two identical files created end up with different names.'), 'FileResource: Create (Legacy)');
   }
+  /**
+   * Test create_raw method.
+   */
+  public function testResourceFileCreateRaw() {
+    // Create file with call.
+    $result = $this->servicesPostFile($this->endpoint->path . '/file/create_raw', $this->testfile->uri);
+    $this->assertEqual($result['code'], 200, t('File created.'), 'FileResource: Create');
 
+    // Load file and assert that it exists.
+    $file_load = file_load($result['body'][0]['fid']);
+    $this->assertTrue(is_file($file_load->uri), t('New file saved to disk.'), 'FileResource: Create');
+  }
   /**
    * Test retrieve method.
    */
diff --git a/tests/functional/ServicesWebTestCase.php b/tests/functional/ServicesWebTestCase.php
index 6c209d5..c91c08b 100644
--- a/tests/functional/ServicesWebTestCase.php
+++ b/tests/functional/ServicesWebTestCase.php
@@ -28,6 +28,38 @@ class ServicesWebTestCase extends DrupalWebTestCase {
                    '<hr />Raw response: ' . $content);
     return array('header' => $header, 'status' => $status, 'code' => $code, 'body' => $body);
   }
+  protected function servicesPostFile($url, $filepath, $headers = array()) {
+    $options = array();
+    // Add .php to get serialized response.
+    $url = $this->getAbsoluteUrl($url) . '.php';
+
+    // Otherwise Services will reject arguments.
+    $headers[] = "Content-type: multipart/form-data";
+    // Prepare arguments.
+    $filepath = variable_get('file_public_path', '') . '/' . file_uri_target($filepath);
+    $post = array('files[file_contents]'=>'@'.$filepath);
+
+    $content = $this->curlExec(array(
+      CURLOPT_URL => $url,
+      CURLOPT_POST => TRUE,
+      CURLOPT_POSTFIELDS => $post,
+      CURLOPT_HTTPHEADER => $headers,
+      CURLOPT_HEADER => TRUE,
+      CURLOPT_RETURNTRANSFER => TRUE,
+      CURLOPT_FOLLOWLOCATION => TRUE,
+      CURLOPT_VERBOSE => TRUE,
+    ));
+
+    // Parse response.
+    list($info, $header, $status, $code, $body) = $this->parseHeader($content);
+
+    $this->verbose('POST request to: ' . $url .
+                   '<hr />File Name: ' . highlight_string('<?php . ' . var_export($filepath, TRUE), TRUE) .
+                   '<hr />Response: ' . highlight_string('<?php ' . var_export($body, TRUE), TRUE) .
+                   '<hr />Curl info: ' . highlight_string('<?php ' . var_export($info, TRUE), TRUE) .
+                   '<hr />Raw response: ' . $content);
+    return array('header' => $header, 'status' => $status, 'code' => $code, 'body' => $body);
+  }
 
   protected function servicesPost($url, $data = array(), $headers = array(), $call_type = 'php') {
     $options = array();
@@ -207,6 +239,7 @@ class ServicesWebTestCase extends DrupalWebTestCase {
           'application/plist' => TRUE,
           'application/plist+xml' => TRUE,
           'application/x-www-form-urlencoded' => TRUE,
+          'multipart/form-data' => TRUE,
         ),
       ),
     );
@@ -253,6 +286,11 @@ class ServicesWebTestCase extends DrupalWebTestCase {
             'enabled' => 1,
           ),
         ),
+        'actions' => array(
+          'create_raw' => array(
+            'enabled' => 1,
+          ),
+        ),
       ),
       'node' => array(
         'operations' => array(
