diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp
index 2230243..a97fc3d 100644
--- a/src/Device/Blitter.cpp
+++ b/src/Device/Blitter.cpp
@@ -40,7 +40,7 @@
 	void Blitter::clear(void *pixel, vk::Format format, vk::Image *dest, const vk::Format& viewFormat, const VkImageSubresourceRange& subresourceRange, const VkRect2D* renderArea)
 	{
 		VkImageAspectFlagBits aspect = static_cast<VkImageAspectFlagBits>(subresourceRange.aspectMask);
-		vk::Format dstFormat = vk::Image::GetFormat(viewFormat, aspect);
+		vk::Format dstFormat = viewFormat.getAspectFormat(aspect);
 		if(dstFormat == VK_FORMAT_UNDEFINED)
 		{
 			return;
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index e4ba3e1..cf11440 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -147,7 +147,7 @@
 			}
 		}
 
-		bool force32BitFiltering = state.highPrecisionFiltering && !hasYuvFormat() && (state.textureFilter != FILTER_POINT);
+		bool force32BitFiltering = state.highPrecisionFiltering && !isYcbcrFormat() && (state.textureFilter != FILTER_POINT);
 		bool seamlessCube = (state.addressingModeU == ADDRESSING_SEAMLESS);
 		bool use32BitFiltering = hasFloatTexture() || hasUnnormalizedIntegerTexture() || force32BitFiltering ||
 		                         seamlessCube || state.unnormalizedCoordinates || state.compareEnable || state.largeTexture ||
@@ -1601,7 +1601,7 @@
 		UInt index[4];
 		computeIndices(index, uuuu, vvvv, wwww, offset, mipmap, function);
 
-		if(hasYuvFormat())
+		if(isYcbcrFormat())
 		{
 			// Generic YPbPr to RGB transformation
 			// R = Y                               +           2 * (1 - Kr) * Pr
@@ -1844,7 +1844,7 @@
 		}
 		else
 		{
-			ASSERT(!hasYuvFormat());
+			ASSERT(!isYcbcrFormat());
 
 			Vector4s cs = sampleTexel(index, buffer);
 
@@ -1989,7 +1989,7 @@
 		{
 			buffer[0] = *Pointer<Pointer<Byte>>(mipmap + OFFSET(Mipmap,buffer[0]));
 
-			if(hasYuvFormat())
+			if(isYcbcrFormat())
 			{
 				buffer[1] = *Pointer<Pointer<Byte>>(mipmap + OFFSET(Mipmap,buffer[1]));
 				buffer[2] = *Pointer<Pointer<Byte>>(mipmap + OFFSET(Mipmap,buffer[2]));
@@ -2356,9 +2356,9 @@
 		return state.textureFormat.has32bitIntegerTextureComponents();
 	}
 
-	bool SamplerCore::hasYuvFormat() const
+	bool SamplerCore::isYcbcrFormat() const
 	{
-		return state.textureFormat.hasYuvFormat();
+		return state.textureFormat.isYcbcrFormat();
 	}
 
 	bool SamplerCore::isRGBComponent(int component) const
diff --git a/src/Pipeline/SamplerCore.hpp b/src/Pipeline/SamplerCore.hpp
index 068139b..0b75bf1 100644
--- a/src/Pipeline/SamplerCore.hpp
+++ b/src/Pipeline/SamplerCore.hpp
@@ -107,7 +107,7 @@
 		bool has8bitTextureComponents() const;
 		bool has16bitTextureComponents() const;
 		bool has32bitIntegerTextureComponents() const;
-		bool hasYuvFormat() const;
+		bool isYcbcrFormat() const;
 		bool isRGBComponent(int component) const;
 		bool borderModeActive() const;
 		VkComponentSwizzle gatherSwizzle() const;
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index 152afdd..1d5ed01 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -86,6 +86,57 @@
 	return isSignedNonNormalizedInteger() || isUnsignedNonNormalizedInteger();
 }
 
+VkImageAspectFlags Format::getAspects() const
+{
+	// TODO: probably just flatten this out to a full format list, and alter
+	// isDepth / isStencil etc to check for their aspect
+
+	VkImageAspectFlags aspects = 0;
+	if (isDepth()) aspects |= VK_IMAGE_ASPECT_DEPTH_BIT;
+	if (isStencil()) aspects |= VK_IMAGE_ASPECT_STENCIL_BIT;
+
+	// TODO: YCbCr planar formats have different aspects
+
+	// Anything else is "color".
+	if (!aspects) aspects |= VK_IMAGE_ASPECT_COLOR_BIT;
+	return aspects;
+}
+
+Format Format::getAspectFormat(VkImageAspectFlags aspect) const
+{
+	switch(aspect)
+	{
+	case VK_IMAGE_ASPECT_DEPTH_BIT:
+		switch(format)
+		{
+		case VK_FORMAT_D16_UNORM_S8_UINT:
+			return VK_FORMAT_D16_UNORM;
+		case VK_FORMAT_D24_UNORM_S8_UINT:
+			return VK_FORMAT_X8_D24_UNORM_PACK32; // FIXME: This will allocate an extra byte per pixel
+		case VK_FORMAT_D32_SFLOAT_S8_UINT:
+			return VK_FORMAT_D32_SFLOAT;
+		default:
+			break;
+		}
+		break;
+	case VK_IMAGE_ASPECT_STENCIL_BIT:
+		switch(format)
+		{
+		case VK_FORMAT_D16_UNORM_S8_UINT:
+		case VK_FORMAT_D24_UNORM_S8_UINT:
+		case VK_FORMAT_D32_SFLOAT_S8_UINT:
+			return VK_FORMAT_S8_UINT;
+		default:
+			break;
+		}
+		break;
+	default:
+		break;
+	}
+
+	return format;
+}
+
 bool Format::isStencil() const
 {
 	switch(format)
@@ -306,6 +357,18 @@
 	return false;
 }
 
+bool Format::isYcbcrFormat() const
+{
+	switch(format)
+	{
+	case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+	case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+		return true;
+	default:
+		return false;
+	}
+}
+
 bool Format::isCompressed() const
 {
 	switch(format)
@@ -1983,69 +2046,6 @@
 	return false;
 }
 
-bool Format::hasYuvFormat() const
-{
-	switch(format)
-	{
-	case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
-		return true;
-	case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
-	case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
-	case VK_FORMAT_R5G6B5_UNORM_PACK16:
-	case VK_FORMAT_R8_SNORM:
-	case VK_FORMAT_R8G8_SNORM:
-	case VK_FORMAT_R8G8B8A8_SNORM:
-	case VK_FORMAT_R8_SINT:
-	case VK_FORMAT_R8_UINT:
-	case VK_FORMAT_R8G8_SINT:
-	case VK_FORMAT_R8G8_UINT:
-	case VK_FORMAT_R8G8B8A8_SINT:
-	case VK_FORMAT_R8G8B8A8_UINT:
-	case VK_FORMAT_R32_SINT:
-	case VK_FORMAT_R32_UINT:
-	case VK_FORMAT_R32G32_SINT:
-	case VK_FORMAT_R32G32_UINT:
-	case VK_FORMAT_R32G32B32A32_SINT:
-	case VK_FORMAT_R32G32B32A32_UINT:
-	case VK_FORMAT_R8G8_UNORM:
-	case VK_FORMAT_B8G8R8_UNORM:
-	case VK_FORMAT_B8G8R8A8_UNORM:
-	case VK_FORMAT_R8G8B8A8_UNORM:
-	case VK_FORMAT_B8G8R8_SRGB:
-	case VK_FORMAT_R8G8B8A8_SRGB:
-	case VK_FORMAT_B8G8R8A8_SRGB:
-	case VK_FORMAT_R32_SFLOAT:
-	case VK_FORMAT_R32G32_SFLOAT:
-	case VK_FORMAT_R32G32B32A32_SFLOAT:
-	case VK_FORMAT_R8_UNORM:
-	case VK_FORMAT_R16_UNORM:
-	case VK_FORMAT_R16_SNORM:
-	case VK_FORMAT_R16G16_UNORM:
-	case VK_FORMAT_R16G16_SNORM:
-	case VK_FORMAT_R16G16B16A16_UNORM:
-	case VK_FORMAT_R16_SINT:
-	case VK_FORMAT_R16_UINT:
-	case VK_FORMAT_R16_SFLOAT:
-	case VK_FORMAT_R16G16_SINT:
-	case VK_FORMAT_R16G16_UINT:
-	case VK_FORMAT_R16G16_SFLOAT:
-	case VK_FORMAT_R16G16B16A16_SINT:
-	case VK_FORMAT_R16G16B16A16_UINT:
-	case VK_FORMAT_R16G16B16A16_SFLOAT:
-	case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
-	case VK_FORMAT_A2B10G10R10_UINT_PACK32:
-	case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
-	case VK_FORMAT_D32_SFLOAT:
-	case VK_FORMAT_D16_UNORM:
-	case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
-		return false;
-	default:
-		UNIMPLEMENTED("Format: %d", int(format));
-	}
-
-	return false;
-}
-
 bool Format::isRGBComponent(int component) const
 {
 	switch(format)
diff --git a/src/Vulkan/VkFormat.h b/src/Vulkan/VkFormat.h
index 7184c34..15385f4 100644
--- a/src/Vulkan/VkFormat.h
+++ b/src/Vulkan/VkFormat.h
@@ -36,13 +36,15 @@
 	bool isUnsignedNonNormalizedInteger() const;
 	bool isNonNormalizedInteger() const;
 
+	VkImageAspectFlags getAspects() const;
+	Format getAspectFormat(VkImageAspectFlags aspect) const;
 	bool isStencil() const;
 	bool isDepth() const;
 	bool hasQuadLayout() const;
 	VkFormat getNonQuadLayoutFormat() const;
-
 	bool isSRGBformat() const;
 	bool isFloatFormat() const;
+	bool isYcbcrFormat() const;
 
 	bool isCompatible(const Format& other) const;
 	bool isCompressed() const;
@@ -65,7 +67,6 @@
 	bool has8bitTextureComponents() const;
 	bool has16bitTextureComponents() const;
 	bool has32bitIntegerTextureComponents() const;
-	bool hasYuvFormat() const;
 	bool isRGBComponent(int component) const;
 
 private:
diff --git a/src/Vulkan/VkImage.cpp b/src/Vulkan/VkImage.cpp
index cf44d68..d56070b 100644
--- a/src/Vulkan/VkImage.cpp
+++ b/src/Vulkan/VkImage.cpp
@@ -22,22 +22,6 @@
 
 namespace
 {
-	VkImageAspectFlags GetAspects(vk::Format format)
-	{
-		// TODO: probably just flatten this out to a full format list, and alter
-		// isDepth / isStencil etc to check for their aspect
-
-		VkImageAspectFlags aspects = 0;
-		if (format.isDepth()) aspects |= VK_IMAGE_ASPECT_DEPTH_BIT;
-		if (format.isStencil()) aspects |= VK_IMAGE_ASPECT_STENCIL_BIT;
-
-		// TODO: YCbCr planar formats have different aspects
-
-		// Anything else is "color".
-		if (!aspects) aspects |= VK_IMAGE_ASPECT_COLOR_BIT;
-		return aspects;
-	}
-
 	ETC_Decoder::InputType GetInputType(const vk::Format& format)
 	{
 		switch(format)
@@ -108,8 +92,8 @@
 	VkMemoryRequirements memoryRequirements;
 	memoryRequirements.alignment = vk::REQUIRED_MEMORY_ALIGNMENT;
 	memoryRequirements.memoryTypeBits = vk::MEMORY_TYPE_GENERIC_BIT;
-	memoryRequirements.size = getStorageSize(GetAspects(format)) +
-	                          (decompressedImage ? decompressedImage->getStorageSize(GetAspects(decompressedImage->format)) : 0);
+	memoryRequirements.size = getStorageSize(format.getAspects()) +
+	                          (decompressedImage ? decompressedImage->getStorageSize(decompressedImage->format.getAspects()) : 0);
 	return memoryRequirements;
 }
 
@@ -120,7 +104,7 @@
 	if(decompressedImage)
 	{
 		decompressedImage->deviceMemory = deviceMemory;
-		decompressedImage->memoryOffset = memoryOffset + getStorageSize(GetAspects(format));
+		decompressedImage->memoryOffset = memoryOffset + getStorageSize(format.getAspects());
 	}
 }
 
@@ -569,42 +553,7 @@
 
 Format Image::getFormat(VkImageAspectFlagBits aspect) const
 {
-	return GetFormat(format, aspect);
-}
-
-Format Image::GetFormat(const vk::Format& format, VkImageAspectFlagBits aspect)
-{
-	switch(aspect)
-	{
-	case VK_IMAGE_ASPECT_DEPTH_BIT:
-		switch(format)
-		{
-		case VK_FORMAT_D16_UNORM_S8_UINT:
-			return VK_FORMAT_D16_UNORM;
-		case VK_FORMAT_D24_UNORM_S8_UINT:
-			return VK_FORMAT_X8_D24_UNORM_PACK32; // FIXME: This will allocate an extra byte per pixel
-		case VK_FORMAT_D32_SFLOAT_S8_UINT:
-			return VK_FORMAT_D32_SFLOAT;
-		default:
-			break;
-		}
-		break;
-	case VK_IMAGE_ASPECT_STENCIL_BIT:
-		switch(format)
-		{
-		case VK_FORMAT_D16_UNORM_S8_UINT:
-		case VK_FORMAT_D24_UNORM_S8_UINT:
-		case VK_FORMAT_D32_SFLOAT_S8_UINT:
-			return VK_FORMAT_S8_UINT;
-		default:
-			break;
-		}
-		break;
-	default:
-		break;
-	}
-
-	return format;
+	return format.getAspectFormat(aspect);
 }
 
 bool Image::isCube() const
diff --git a/src/Vulkan/VkImage.hpp b/src/Vulkan/VkImage.hpp
index ac37f1e..24c48fe 100644
--- a/src/Vulkan/VkImage.hpp
+++ b/src/Vulkan/VkImage.hpp
@@ -72,8 +72,6 @@
 	void                     prepareForSampling(const VkImageSubresourceRange& subresourceRange);
 	const Image*             getSampledImage(const vk::Format& imageViewFormat) const;
 
-	static Format            GetFormat(const vk::Format& format, VkImageAspectFlagBits aspect);
-
 private:
 	void copy(VkBuffer buffer, const VkBufferImageCopy& region, bool bufferIsSource);
 	VkDeviceSize getStorageSize(VkImageAspectFlags flags) const;
