diff --git a/lib/private/image.php b/lib/private/image.php
index a4a23f0f097940d5df9566b3a33a732d61e57654..c987ce92c3c6d8257d96b791482c3f7fa465f51e 100644
--- a/lib/private/image.php
+++ b/lib/private/image.php
@@ -35,7 +35,7 @@ class OC_Image {
 	/**
 	* @brief Get mime type for an image file.
 	* @param string|null $filepath The path to a local image file.
-	* @returns string The mime type if the it could be determined, otherwise an empty string.
+	* @return string The mime type if the it could be determined, otherwise an empty string.
 	*/
 	static public function getMimeTypeForFile($filePath) {
 		// exif_imagetype throws "read error!" if file is less than 12 byte
@@ -48,10 +48,11 @@ class OC_Image {
 	}
 
 	/**
-	* @brief Constructor.
-	* @param string|resource $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function.
-	* @returns bool False on error
-	*/
+	 * @brief Constructor.
+	 * @param resource|string $imageref The path to a local file, a base64 encoded string or a resource created by
+	 * an imagecreate* function.
+	 * @return \OC_Image False on error
+	 */
 	public function __construct($imageRef = null) {
 		//OC_Log::write('core',__METHOD__.'(): start', OC_Log::DEBUG);
 		if(!extension_loaded('gd') || !function_exists('gd_info')) {
@@ -70,7 +71,7 @@ class OC_Image {
 
 	/**
 	* @brief Determine whether the object contains an image resource.
-	* @returns bool
+	* @return bool
 	*/
 	public function valid() { // apparently you can't name a method 'empty'...
 		return is_resource($this->resource);
@@ -78,7 +79,7 @@ class OC_Image {
 
 	/**
 	* @brief Returns the MIME type of the image or an empty string if no image is loaded.
-	* @returns int
+	* @return int
 	*/
 	public function mimeType() {
 		return $this->valid() ? $this->mimeType : '';
@@ -86,7 +87,7 @@ class OC_Image {
 
 	/**
 	* @brief Returns the width of the image or -1 if no image is loaded.
-	* @returns int
+	* @return int
 	*/
 	public function width() {
 		return $this->valid() ? imagesx($this->resource) : -1;
@@ -94,7 +95,7 @@ class OC_Image {
 
 	/**
 	* @brief Returns the height of the image or -1 if no image is loaded.
-	* @returns int
+	* @return int
 	*/
 	public function height() {
 		return $this->valid() ? imagesy($this->resource) : -1;
@@ -102,7 +103,7 @@ class OC_Image {
 
 	/**
 	* @brief Returns the width when the image orientation is top-left.
-	* @returns int
+	* @return int
 	*/
 	public function widthTopLeft() {
 		$o = $this->getOrientation();
@@ -125,7 +126,7 @@ class OC_Image {
 
 	/**
 	* @brief Returns the height when the image orientation is top-left.
-	* @returns int
+	* @return int
 	*/
 	public function heightTopLeft() {
 		$o = $this->getOrientation();
@@ -147,34 +148,46 @@ class OC_Image {
 	}
 
 	/**
-	* @brief Outputs the image.
-	* @returns bool
-	*/
-	public function show() {
-		header('Content-Type: '.$this->mimeType());
-		return $this->_output();
+	 * @brief Outputs the image.
+	 * @param string $mimeType
+	 * @return bool
+	 */
+	public function show($mimeType=null) {
+		if($mimeType === null) {
+			$mimeType = $this->mimeType();
+		}
+		header('Content-Type: '.$mimeType);
+		return $this->_output(null, $mimeType);
 	}
 
 	/**
-	* @brief Saves the image.
-	* @returns bool
-	* @param string $filePath
-	*/
+	 * @brief Saves the image.
+	 * @param string $filePath
+	 * @param string $mimeType
+	 * @return bool
+	 */
 
-	public function save($filePath=null) {
+	public function save($filePath=null, $mimeType=null) {
+		if($mimeType === null) {
+			$mimeType = $this->mimeType();
+		}
 		if($filePath === null && $this->filePath === null) {
 			OC_Log::write('core', __METHOD__.'(): called with no path.', OC_Log::ERROR);
 			return false;
 		} elseif($filePath === null && $this->filePath !== null) {
 			$filePath = $this->filePath;
 		}
-		return $this->_output($filePath);
+		return $this->_output($filePath, $mimeType);
 	}
 
 	/**
-	* @brief Outputs/saves the image.
-	*/
-	private function _output($filePath=null) {
+	 * @brief Outputs/saves the image.
+	 * @param string $filePath
+	 * @param string $mimeType
+	 * @return bool
+	 * @throws Exception
+	 */
+	private function _output($filePath=null, $mimeType=null) {
 		if($filePath) {
 			if (!file_exists(dirname($filePath)))
 				mkdir(dirname($filePath), 0777, true);
@@ -192,7 +205,30 @@ class OC_Image {
 			return false;
 		}
 
-		switch($this->imageType) {
+		$imageType = $this->imageType;
+		if($mimeType !== null) {
+			switch($mimeType) {
+				case 'image/gif':
+					$imageType = IMAGETYPE_GIF;
+					break;
+				case 'image/jpeg':
+					$imageType = IMAGETYPE_JPEG;
+					break;
+				case 'image/png':
+					$imageType = IMAGETYPE_PNG;
+					break;
+				case 'image/x-xbitmap':
+					$imageType = IMAGETYPE_XBM;
+					break;
+				case 'image/bmp':
+					$imageType = IMAGETYPE_BMP;
+					break;
+				default:
+					throw new Exception('\OC_Image::_output(): "' . $mimeType . '" is not supported when forcing a specific output format');
+			}
+		}
+
+		switch($imageType) {
 			case IMAGETYPE_GIF:
 				$retVal = imagegif($this->resource, $filePath);
 				break;
@@ -203,7 +239,12 @@ class OC_Image {
 				$retVal = imagepng($this->resource, $filePath);
 				break;
 			case IMAGETYPE_XBM:
-				$retVal = imagexbm($this->resource, $filePath);
+				if (function_exists('imagexbm')) {
+					$retVal = imagexbm($this->resource, $filePath);
+				} else {
+					throw new Exception('\OC_Image::_output(): imagexbm() is not supported.');
+				}
+
 				break;
 			case IMAGETYPE_WBMP:
 				$retVal = imagewbmp($this->resource, $filePath);
@@ -225,14 +266,14 @@ class OC_Image {
 	}
 
 	/**
-	* @returns resource Returns the image resource in any.
+	* @return resource Returns the image resource in any.
 	*/
 	public function resource() {
 		return $this->resource;
 	}
 
 	/**
-	* @returns Returns the raw image data.
+	* @return string Returns the raw image data.
 	*/
 	function data() {
 		ob_start();
@@ -267,7 +308,7 @@ class OC_Image {
 	/**
 	* (I'm open for suggestions on better method name ;)
 	* @brief Get the orientation based on EXIF data.
-	* @returns The orientation or -1 if no EXIF data is available.
+	* @return int The orientation or -1 if no EXIF data is available.
 	*/
 	public function getOrientation() {
 		if(!is_callable('exif_read_data')) {
@@ -295,7 +336,7 @@ class OC_Image {
 	/**
 	* (I'm open for suggestions on better method name ;)
 	* @brief Fixes orientation based on EXIF data.
-	* @returns bool.
+	* @return bool.
 	*/
 	public function fixOrientation() {
 		$o = $this->getOrientation();
@@ -355,10 +396,10 @@ class OC_Image {
 	}
 
 	/**
-	* @brief Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function.
-	* @param $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function or a file resource (file handle	).
-	* @returns An image resource or false on error
-	*/
+	 * @brief Loads an image from a local file, a base64 encoded string or a resource created by an imagecreate* function.
+	 * @param resource|string $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function or a file resource (file handle    ).
+	 * @return resource|false An image resource or false on error
+	 */
 	public function load($imageRef) {
 		if(is_resource($imageRef)) {
 			if(get_resource_type($imageRef) == 'gd') {
@@ -383,7 +424,7 @@ class OC_Image {
 	* @brief Loads an image from an open file handle.
 	* It is the responsibility of the caller to position the pointer at the correct place and to close the handle again.
 	* @param resource $handle
-	* @returns An image resource or false on error
+	* @return An image resource or false on error
 	*/
 	public function loadFromFileHandle($handle) {
 		OC_Log::write('core', __METHOD__.'(): Trying', OC_Log::DEBUG);
@@ -395,8 +436,8 @@ class OC_Image {
 
 	/**
 	* @brief Loads an image from a local file.
-	* @param $imagePath The path to a local file.
-	* @returns An image resource or false on error
+	* @param bool|string $imagePath The path to a local file.
+	* @return bool|resource An image resource or false on error
 	*/
 	public function loadFromFile($imagePath=false) {
 		// exif_imagetype throws "read error!" if file is less than 12 byte
@@ -496,8 +537,8 @@ class OC_Image {
 
 	/**
 	* @brief Loads an image from a string of data.
-	* @param $str A string of image data as read from a file.
-	* @returns An image resource or false on error
+	* @param string $str A string of image data as read from a file.
+	* @return bool|resource An image resource or false on error
 	*/
 	public function loadFromData($str) {
 		if(is_resource($str)) {
@@ -521,8 +562,8 @@ class OC_Image {
 
 	/**
 	* @brief Loads an image from a base64 encoded string.
-	* @param $str A string base64 encoded string of image data.
-	* @returns An image resource or false on error
+	* @param string $str A string base64 encoded string of image data.
+	* @return bool|resource An image resource or false on error
 	*/
 	public function loadFromBase64($str) {
 		if(!is_string($str)) {
@@ -551,7 +592,7 @@ class OC_Image {
 	 * @param string $fileName <p>
 	 * Path to the BMP image.
 	 * </p>
-	 * @return resource an image resource identifier on success, <b>FALSE</b> on errors.
+	 * @return bool|resource an image resource identifier on success, <b>FALSE</b> on errors.
 	 */
 	private function imagecreatefrombmp($fileName) {
 		if (!($fh = fopen($fileName, 'rb'))) {
@@ -690,7 +731,7 @@ class OC_Image {
 	/**
 	* @brief Resizes the image preserving ratio.
 	* @param integer $maxSize The maximum size of either the width or height.
-	* @returns bool
+	* @return bool
 	*/
 	public function resize($maxSize) {
 		if(!$this->valid()) {
@@ -713,6 +754,11 @@ class OC_Image {
 		return true;
 	}
 
+	/**
+	 * @param int $width
+	 * @param int $height
+	 * @return bool
+	 */
 	public function preciseResize($width, $height) {
 		if (!$this->valid()) {
 			OC_Log::write('core', __METHOD__.'(): No image loaded', OC_Log::ERROR);
@@ -748,8 +794,8 @@ class OC_Image {
 
 	/**
 	* @brief Crops the image to the middle square. If the image is already square it just returns.
-	* @param int maximum size for the result (optional)
-	* @returns bool for success or failure
+	* @param int $size maximum size for the result (optional)
+	* @return bool for success or failure
 	*/
 	public function centerCrop($size=0) {
 		if(!$this->valid()) {
@@ -807,11 +853,11 @@ class OC_Image {
 
 	/**
 	* @brief Crops the image from point $x$y with dimension $wx$h.
-	* @param $x Horizontal position
-	* @param $y Vertical position
-	* @param $w Width
-	* @param $h Height
-	* @returns bool for success or failure
+	* @param int $x Horizontal position
+	* @param int $y Vertical position
+	* @param int $w Width
+	* @param int $h Height
+	* @return bool for success or failure
 	*/
 	public function crop($x, $y, $w, $h) {
 		if(!$this->valid()) {
@@ -839,7 +885,7 @@ class OC_Image {
 	 * @brief Resizes the image to fit within a boundry while preserving ratio.
 	 * @param integer $maxWidth
 	 * @param integer $maxHeight
-	 * @returns bool
+	 * @return bool
 	 */
 	public function fitIn($maxWidth, $maxHeight) {
 		if(!$this->valid()) {
diff --git a/lib/private/preview.php b/lib/private/preview.php
index 74051fbc2a3dab8d772e8ce81fcff879986aa960..70bfdb6e70ace9554ae8164a1c0c29e3677ff03f 100755
--- a/lib/private/preview.php
+++ b/lib/private/preview.php
@@ -463,7 +463,7 @@ class Preview {
 		if (is_null($this->preview)) {
 			$this->getPreview();
 		}
-		$this->preview->show();
+		$this->preview->show('image/png');
 		return;
 	}
 
diff --git a/tests/lib/image.php b/tests/lib/image.php
index 4aba1b0bc61e56fd46eb7dfaebac55273aed2a34..131a9d86f3eaef89200d003bdbff303581cd1eb1 100644
--- a/tests/lib/image.php
+++ b/tests/lib/image.php
@@ -8,8 +8,8 @@
 
 class Test_Image extends PHPUnit_Framework_TestCase {
 	public static function tearDownAfterClass() {
-		unlink(OC::$SERVERROOT.'/tests/data/testimage2.png');
-		unlink(OC::$SERVERROOT.'/tests/data/testimage2.jpg');
+		@unlink(OC::$SERVERROOT.'/tests/data/testimage2.png');
+		@unlink(OC::$SERVERROOT.'/tests/data/testimage2.jpg');
 	}
 
 	public function testGetMimeTypeForFile() {
@@ -236,4 +236,24 @@ class Test_Image extends PHPUnit_Framework_TestCase {
 		$this->assertEquals(200, $img->width());
 		$this->assertEquals(200, $img->height());
 	}
+
+	function convertDataProvider() {
+		return array(
+			array( 'image/gif'),
+			array( 'image/jpeg'),
+			array( 'image/png'),
+		);
+	}
+
+	/**
+	 * @dataProvider convertDataProvider
+	 */
+	public function testConvert($mimeType) {
+		$img = new \OC_Image(OC::$SERVERROOT.'/tests/data/testimage.png');
+		$tempFile = tempnam(sys_get_temp_dir(), 'img-test');
+
+		$img->save($tempFile, $mimeType);
+		$actualMimeType = \OC_Image::getMimeTypeForFile($tempFile);
+		$this->assertEquals($mimeType, $actualMimeType);
+	}
 }