public async Task<IQueryable<UploadImage>> ProductImages()
		{
			if (!Request.Content.IsMimeMultipartContent())
			{
				throw this.ExceptionUnsupportedMediaType();
			}

			Product entity = null;
			string identifier = null;
			string tempDir = FileSystemHelper.TempDir();
			var provider = new MultipartFormDataStreamProvider(tempDir);

			try
			{
				await Request.Content.ReadAsMultipartAsync(provider);
			}
			catch (Exception exception)
			{
				provider.DeleteLocalFiles();
				throw this.ExceptionInternalServerError(exception);
			}

			// find product entity
			if (provider.FormData.AllKeys.Contains("Id"))
			{
				identifier = provider.FormData.GetValues("Id").FirstOrDefault();
				entity = _productService.Value.GetProductById(identifier.ToInt());
			}
			else if (provider.FormData.AllKeys.Contains("Sku"))
			{
				identifier = provider.FormData.GetValues("Sku").FirstOrDefault();
				entity = _productService.Value.GetProductBySku(identifier);
			}
			else if (provider.FormData.AllKeys.Contains("Gtin"))
			{
				identifier = provider.FormData.GetValues("Gtin").FirstOrDefault();
				entity = _productService.Value.GetProductByGtin(identifier);
			}

			if (entity == null)
			{
				provider.DeleteLocalFiles();
				throw this.ExceptionNotFound(WebApiGlobal.Error.EntityNotFound.FormatInvariant(identifier.NaIfEmpty()));
			}

			// process images
			var equalPictureId = 0;
			var displayOrder = 0;
			var result = new List<UploadImage>();
			var storeUrl = _storeContext.Value.CurrentStore.Url;
			var pictures = entity.ProductPictures.Select(x => x.Picture);

			if (entity.ProductPictures.Count > 0)
				displayOrder = entity.ProductPictures.Max(x => x.DisplayOrder);

			foreach (var file in provider.FileData)
			{
				var image = new UploadImage(file.Headers);

				if (image.FileName.IsEmpty())
					image.FileName = entity.Name;

				var pictureBinary = File.ReadAllBytes(file.LocalFileName);

				if (pictureBinary != null && pictureBinary.Length > 0)
				{
					pictureBinary = _pictureService.Value.ValidatePicture(pictureBinary);
					pictureBinary = _pictureService.Value.FindEqualPicture(pictureBinary, pictures, out equalPictureId);

					if (pictureBinary != null)
					{
						var seoName = _pictureService.Value.GetPictureSeName(Path.GetFileNameWithoutExtension(image.FileName));

						var newPicture = _pictureService.Value.InsertPicture(pictureBinary, image.MediaType, seoName, true, false, false);

						if (newPicture != null)
						{
							_productService.Value.InsertProductPicture(new ProductPicture
							{
								PictureId = newPicture.Id,
								ProductId = entity.Id,
								DisplayOrder = ++displayOrder
							});

							image.Inserted = true;
							image.Picture = newPicture;
						}
					}
					else
					{
						image.Exists = true;
						image.Picture = pictures.FirstOrDefault(x => x.Id == equalPictureId);
					}

					if (image.Picture != null)
					{
						image.ImageUrl = _pictureService.Value.GetPictureUrl(image.Picture, _mediaSettings.Value.ProductDetailsPictureSize, false, storeUrl);
						image.ThumbImageUrl = _pictureService.Value.GetPictureUrl(image.Picture, _mediaSettings.Value.ProductThumbPictureSize, false, storeUrl);
						image.FullSizeImageUrl = _pictureService.Value.GetPictureUrl(image.Picture, 0, false, storeUrl);
					}
				}

				result.Add(image);
			}

			provider.DeleteLocalFiles();
			return result.AsQueryable();
		}