diff --git a/lib/filesystemview.php b/lib/filesystemview.php
index 95873bd87cfabd61f519611d7ade6716dadf8497..ac5a0a3bff50bc81d6039dd614033a4fae05b8bd 100644
--- a/lib/filesystemview.php
+++ b/lib/filesystemview.php
@@ -136,15 +136,16 @@ class OC_FilesystemView {
 		return $this->basicOperation('filesize',$path);
 	}
 	public function readfile($path){
+		@ob_end_clean();
 		$handle=$this->fopen($path,'r');
 		if ($handle) {
-			$chunkSize = 1024*1024;// 1 MB chunks
+			$chunkSize = 8*1024;// 1 MB chunks
 			while (!feof($handle)) {
 				echo fread($handle, $chunkSize);
-				@ob_flush();
 				flush();
 			}
-			return $this->filesize($path);
+			$size=$this->filesize($path);
+			return $size;
 		}
 		return false;
 	}
@@ -174,11 +175,23 @@ class OC_FilesystemView {
 	}
 	public function file_put_contents($path,$data){
 		if(is_resource($data)){//not having to deal with streams in file_put_contents makes life easier
+			$exists=$this->file_exists($path);
+			$run=true;
+			if(!$exists){
+				OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_create, array( OC_Filesystem::signal_param_path => $path, OC_Filesystem::signal_param_run => &$run));
+			}
+			OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_write, array( OC_Filesystem::signal_param_path => $path, OC_Filesystem::signal_param_run => &$run));
+			if(!$run){
+				return false;
+			}
 			$target=$this->fopen($path,'w');
 			if($target){
 				$count=OC_Helper::streamCopy($data,$target);
 				fclose($target);
 				fclose($data);
+				if(!$exists){
+					OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_create, array( OC_Filesystem::signal_param_path => $path));
+				}
 				OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_write, array( OC_Filesystem::signal_param_path => $path));
 				return $count>0;
 			}else{