diff --git a/cmis.api.inc b/cmis.api.inc
index 2caf263..67ef0fe 100644
--- a/cmis.api.inc
+++ b/cmis.api.inc
@@ -76,6 +76,10 @@ function cmisapi_createDocument($repositoryId, $folderId, $fileName, $properties
   return cmis_vendor_invoke('createDocument', $repositoryId, $folderId, $fileName, $properties, $content, $contentType, $options);
 }
 
+function cmisapi_createDocumentFromSource($repositoryId, $folderId, $fileName, $fileNameFrom, $properties = array(), $options = array()) {
+  return cmis_vendor_invoke('createDocumentFromSource', $repositoryId, $folderId, $fileName, $fileNameFrom, $properties = array(), $options = array());
+}
+
 function cmisapi_createFolder($repositoryId, $folderId, $folderName, $properties=array(),$options=array()) {
   return cmis_vendor_invoke('createFolder', $repositoryId, $folderId, $folderName, $properties, $options);
 }
diff --git a/cmis_common/lib/cmis_repository_wrapper.php b/cmis_common/lib/cmis_repository_wrapper.php
index 979b88e..bc4b718 100644
--- a/cmis_common/lib/cmis_repository_wrapper.php
+++ b/cmis_common/lib/cmis_repository_wrapper.php
@@ -373,6 +373,23 @@ class CMISRepositoryWrapper {
 		
 		return $retval;
 	}
+    static function extractAllowableActions($xmldata) {
+      $doc = new DOMDocument();
+      $doc->loadXML($xmldata);
+      return CMISRepositoryWrapper :: extractAllowableActionsFromNode($doc);
+    }
+    static function extractAllowableActionsFromNode($xmlnode) {
+      $result = array();
+      $allowableActions = $xmlnode->getElementsByTagName("allowableActions");
+      if ($allowableActions->length > 0) {
+        foreach($allowableActions->item(0)->childNodes as $action) {
+          if (isset($action->localName)) {
+            $result[$action->localName] = (preg_match("/^true$/i", $action->nodeValue) > 0);
+          }
+        }
+      }
+      return $result;
+    }
 }
 
 // Option Contants for Array Indexing
@@ -741,8 +758,10 @@ xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
 
 	function getAllowableActions($objectId,$options=array()) {
 		// get stripped down version of object (for the links) and then get the allowable actions?
-		// Low priority -- can get all information when getting object
-		throw Exception("Not Implemented");
+      $myURL = $this->getLink($objectId, LINK_ALLOWABLE_ACTIONS);
+      $ret = $this->doGet($myURL);
+      $result = $this->extractAllowableActions($ret->body);
+      return $result;
 	}
 
 	function getRenditions($objectId,$options=array(OPT_RENDITION_FILTER => "*")) {
@@ -806,8 +825,13 @@ xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
 		return $this->postObject($folderId,$fileName,"cmis:document",$properties,$content,$content_type,$options);
 	}
 
-	function createDocumentFromSource() { //Yes?
-		throw Exception("Not Implemented in This Binding");
+	function createDocumentFromSource($folderId, $fileName, $fileNameFrom, $properties = array(), $options = array()) { //Yes?
+      $fileNameFrom_obj = $this->getObjectByPath($fileNameFrom);
+      $fileNameFrom_objectId = $fileNameFrom_obj->id;
+      $properties = $this->getObject($fileNameFrom_objectId,$options);
+      $content_type = $properties->properties['cmis:contentStreamMimeType'];
+      $content = $this->getContentStream($fileNameFrom_objectId);
+      return $this->createDocument($folderId, $fileName, $properties, $content, $content_type, $options);
 	}
 
 	function createFolder($folderId,$folderName,$properties=array(),$options=array()) { // Yes
