Index: core/kernel/utility/formatters/upload_formatter.php
===================================================================
--- core/kernel/utility/formatters/upload_formatter.php
+++ core/kernel/utility/formatters/upload_formatter.php
@@ -242,16 +242,27 @@
 					$object->SetError($field_name, 'cant_save_file', 'la_error_cant_save_file');
 				}
 				else {
-					$real_name = $this->_getRealFilename($value['name'], $options, $object);
-					$file_name = $this->FullPath . $real_name;
+					$tmp_path = WRITEABLE . '/tmp/';
+					$filename = $this->fileHelper->ensureUniqueFilename($tmp_path, $value['name'] . '.tmp');
+					$tmp_file_path = $tmp_path . $filename;
 
-					$moved = move_uploaded_file($value['tmp_name'], $file_name);
+					$moved = move_uploaded_file($value['tmp_name'], $tmp_file_path);
 					$storage_format = isset($options['storage_format']) ? $options['storage_format'] : false;
 
 					if ( $storage_format ) {
 						/** @var kUploadHelper $upload_helper */
 						$upload_helper = $this->Application->recallObject('kUploadHelper');
-						$moved = $upload_helper->resizeUploadedFile($file_name, $storage_format);
+						$moved = $upload_helper->resizeUploadedFile($tmp_file_path, $storage_format);
+					}
+
+					if ( $moved ) {
+						$real_name = $this->_getRealFilename(
+							kUtil::removeTempExtension(basename($tmp_file_path)),
+							$options,
+							$object
+						);
+						$file_name = $this->FullPath . $real_name;
+						$moved = rename($tmp_file_path, $file_name);
 					}
 
 					if ( !$moved ) {
Index: core/units/helpers/upload_helper.php
===================================================================
--- core/units/helpers/upload_helper.php
+++ core/units/helpers/upload_helper.php
@@ -105,7 +105,7 @@
 			$this->deleteTempFiles($thumbs_path);
 		}
 
-		return preg_replace('/^' . preg_quote($id, '/') . '_/', '', $filename);
+		return preg_replace('/^' . preg_quote($id, '/') . '_/', '', basename($file_path));
 	}
 
 	/**
@@ -116,7 +116,7 @@
 	 *
 	 * @return boolean
 	 */
-	public function resizeUploadedFile($file_path, $format)
+	public function resizeUploadedFile(&$file_path, $format)
 	{
 		/** @var ImageHelper $image_helper */
 		$image_helper = $this->Application->recallObject('ImageHelper');
@@ -132,10 +132,50 @@
 			$image_helper->ResizeImage($resize_file_path, $format)
 		);
 
+		$file_path = $this->replaceFileExtension(
+			$file_path,
+			pathinfo($resized_file_path, PATHINFO_EXTENSION)
+		);
+
 		return rename($resized_file_path, $file_path);
 	}
 
 	/**
+	 * Replace extension of uploaded file.
+	 *
+	 * @param string $file_path          File path.
+	 * @param string $new_file_extension New file extension.
+	 *
+	 * @return string
+	 */
+	protected function replaceFileExtension($file_path, $new_file_extension)
+	{
+		$file_path_without_temp_file_extension = kUtil::removeTempExtension($file_path);
+		$current_file_extension = pathinfo($file_path_without_temp_file_extension, PATHINFO_EXTENSION);
+
+		// Format of resized file wasn't changed.
+		if ( $current_file_extension === $new_file_extension ) {
+			return $file_path;
+		}
+
+		$ret = preg_replace(
+			'/\.' . preg_quote($current_file_extension, '/') . '$/',
+			'.' . $new_file_extension,
+			$file_path_without_temp_file_extension
+		);
+
+		// Add ".tmp" later, since it was removed.
+		if ( $file_path_without_temp_file_extension !== $file_path ) {
+			$ret .= '.tmp';
+		}
+
+		// After file extension change resulting filename might not be unique in that folder anymore.
+		$path = pathinfo($ret, PATHINFO_DIRNAME);
+
+		return $path . '/' . $this->fileHelper->ensureUniqueFilename($path, basename($ret));
+	}
+
+	/**
 	 * Sends headers to ensure, that response is never cached.
 	 *
 	 * @return void