diff --git a/gpu-vulkan-core.cabal b/gpu-vulkan-core.cabal
--- a/gpu-vulkan-core.cabal
+++ b/gpu-vulkan-core.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           gpu-vulkan-core
-version:        0.1.0.16
+version:        0.1.0.17
 synopsis:       Thin wrapper for Vulkan API
 description:    Please see the README on GitHub at <https://github.com/YoshikuniJujo/gpu-vulkan-core#readme>
 category:       GPU
diff --git a/src/Gpu/Vulkan/Buffer/Core.hs-boot b/src/Gpu/Vulkan/Buffer/Core.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Gpu/Vulkan/Buffer/Core.hs-boot
@@ -0,0 +1,6 @@
+module Gpu.Vulkan.Buffer.Core where
+
+import Foreign.Ptr
+
+data MemoryBarrier2
+type PtrMemoryBarrier2 = Ptr MemoryBarrier2
diff --git a/src/Gpu/Vulkan/Buffer/Core.hsc b/src/Gpu/Vulkan/Buffer/Core.hsc
--- a/src/Gpu/Vulkan/Buffer/Core.hsc
+++ b/src/Gpu/Vulkan/Buffer/Core.hsc
@@ -30,8 +30,15 @@
 	memoryBarrierSType, memoryBarrierPNext,
 	memoryBarrierSrcAccessMask, memoryBarrierDstAccessMask,
 	memoryBarrierSrcQueueFamilyIndex, memoryBarrierDstQueueFamilyIndex,
-	memoryBarrierBuffer, memoryBarrierOffset, memoryBarrierSize
+	memoryBarrierBuffer, memoryBarrierOffset, memoryBarrierSize,
 
+	MemoryBarrier2, PtrMemoryBarrier2, pattern MemoryBarrier2,
+	memoryBarrier2SType, memoryBarrier2PNext,
+	memoryBarrier2SrcStageMask, memoryBarrier2SrcAccessMask,
+	memoryBarrier2DstStageMask, memoryBarrier2DstAccessMask,
+	memoryBarrier2SrcQueueFamilyIndex, memoryBarrier2DstQueueFamilyIndex,
+	memoryBarrier2Buffer, memoryBarrier2Offset, memoryBarrier2Size
+
 	) where
 
 import Foreign.Ptr
@@ -138,6 +145,47 @@
 		[| #{peek VkBufferMemoryBarrier, size} |],
 		[| #{poke VkBufferMemoryBarrier, size} |]) ]
 	[''Show, ''Storable]
+
+mbType2 :: #{type VkStructureType}
+mbType2 = #{const VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2}
+
+struct "MemoryBarrier2" #{size VkBufferMemoryBarrier2}
+	#{alignment VkBufferMemoryBarrier2} [
+	("sType", ''(), [| const $ pure() |],
+		[| \p _ -> #{poke VkBufferMemoryBarrier2, sType} p mbType2 |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkBufferMemoryBarrier2, pNext} |],
+		[| #{poke VkBufferMemoryBarrier2, pNext} |]),
+	("srcStageMask", ''#{type VkPipelineStageFlags2},
+		[| #{peek VkBufferMemoryBarrier2, srcStageMask} |],
+		[| #{poke VkBufferMemoryBarrier2, srcStageMask} |]),
+	("srcAccessMask", ''#{type VkAccessFlags2},
+		[| #{peek VkBufferMemoryBarrier2, srcAccessMask} |],
+		[| #{poke VkBufferMemoryBarrier2, srcAccessMask} |]),
+	("dstStageMask", ''#{type VkPipelineStageFlags2},
+		[| #{peek VkBufferMemoryBarrier2, dstStageMask} |],
+		[| #{poke VkBufferMemoryBarrier2, dstStageMask} |]),
+	("dstAccessMask", ''#{type VkAccessFlags2},
+		[| #{peek VkBufferMemoryBarrier2, dstAccessMask} |],
+		[| #{poke VkBufferMemoryBarrier2, dstAccessMask} |]),
+	("srcQueueFamilyIndex", ''#{type uint32_t},
+		[| #{peek VkBufferMemoryBarrier2, srcQueueFamilyIndex} |],
+		[| #{poke VkBufferMemoryBarrier2, srcQueueFamilyIndex} |]),
+	("dstQueueFamilyIndex", ''#{type uint32_t},
+		[| #{peek VkBufferMemoryBarrier2, dstQueueFamilyIndex} |],
+		[| #{poke VkBufferMemoryBarrier2, dstQueueFamilyIndex} |]),
+	("buffer", ''B,
+		[| #{peek VkBufferMemoryBarrier2, buffer} |],
+		[| #{poke VkBufferMemoryBarrier2, buffer} |]),
+	("offset", ''#{type VkDeviceSize},
+		[| #{peek VkBufferMemoryBarrier2, offset} |],
+		[| #{poke VkBufferMemoryBarrier2, offset} |]),
+	("size", ''#{type VkDeviceSize},
+		[| #{peek VkBufferMemoryBarrier2, size} |],
+		[| #{poke VkBufferMemoryBarrier2, size} |]) ]
+	[''Show, ''Storable]
+
+type PtrMemoryBarrier2 = Ptr MemoryBarrier2
 
 struct "ImageCopy" #{size VkBufferImageCopy} #{alignment VkBufferImageCopy} [
 	("bufferOffset", ''#{type VkDeviceSize},
diff --git a/src/Gpu/Vulkan/Cmd/Core.hsc b/src/Gpu/Vulkan/Cmd/Core.hsc
--- a/src/Gpu/Vulkan/Cmd/Core.hsc
+++ b/src/Gpu/Vulkan/Cmd/Core.hsc
@@ -22,7 +22,7 @@
 
 	-- * PIPELINE BARRIER
 
-	pipelineBarrier,
+	pipelineBarrier, pipelineBarrier2,
 
 	-- * QUERY
 
@@ -35,6 +35,7 @@
 import Data.Word
 import Data.Int
 
+import Gpu.Vulkan.Core
 import qualified Gpu.Vulkan.RenderPass.Core as RenderPass
 import qualified Gpu.Vulkan.Pipeline.Core as Pipeline
 import qualified Gpu.Vulkan.CommandBuffer.Core as CommandBuffer
@@ -126,3 +127,6 @@
 foreign import ccall "vkCmdWriteTimestamp" writeTimestamp ::
 	CommandBuffer.C -> #{type VkPipelineStageFlagBits} -> QueryPool.Q ->
 	#{type uint32_t} -> IO ()
+
+foreign import ccall "vkCmdPipelineBarrier2" pipelineBarrier2 ::
+	CommandBuffer.C -> Ptr DependencyInfo -> IO ()
diff --git a/src/Gpu/Vulkan/Core.hsc b/src/Gpu/Vulkan/Core.hsc
--- a/src/Gpu/Vulkan/Core.hsc
+++ b/src/Gpu/Vulkan/Core.hsc
@@ -109,6 +109,16 @@
 	Extent3d, pattern Extent3d,
 	extent3dWidth, extent3dHeight, extent3dDepth,
 
+	-- ** DEPENDENCY INFO
+
+	DependencyInfo, pattern DependencyInfo,
+	dependencyInfoSType, dependencyInfoPNext, dependencyInfoDependencyFlags,
+	dependencyInfoMemoryBarrierCount, dependencyInfoPMemoryBarriers,
+	dependencyInfoBufferMemoryBarrierCount,
+	dependencyInfoPBufferMemoryBarriers,
+	dependencyInfoImageMemoryBarrierCount,
+	dependencyInfoPImageMemoryBarriers
+
 	) where
 
 import Foreign.Ptr
@@ -128,6 +138,10 @@
 import {-# SOURCE #-} qualified Gpu.Vulkan.CommandBuffer.Core as CommandBuffer
 import {-# SOURCE #-} qualified Gpu.Vulkan.Semaphore.Core as Semaphore
 
+import qualified Gpu.Vulkan.Memory.Core as Memory
+import {-# SOURCE #-} qualified Gpu.Vulkan.Buffer.Core as Buffer
+import {-# SOURCE #-} qualified Gpu.Vulkan.Image.Core as Image
+
 #include <vulkan/vulkan.h>
 
 struct "StructCommon" #{size VkApplicationInfo}
@@ -386,4 +400,35 @@
 	("bufferFeatures", ''#{type VkFormatFeatureFlags},
 		[| #{peek VkFormatProperties, bufferFeatures} |],
 		[| #{poke VkFormatProperties, bufferFeatures} |]) ]
+	[''Show, ''Storable]
+
+struct "DependencyInfo" #{size VkDependencyInfo} #{alignment VkDependencyInfo} [
+	("sType",  ''(), [| const $ pure () |],
+		[| \p _ -> #{poke VkApplicationInfo, sType} p
+			(#{const VK_STRUCTURE_TYPE_DEPENDENCY_INFO} ::
+				#{type VkStructureType}) |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkDependencyInfo, pNext} |],
+		[| #{poke VkDependencyInfo, pNext} |]),
+	("dependencyFlags", ''#{type VkDependencyFlags},
+		[| #{peek VkDependencyInfo, dependencyFlags} |],
+		[| #{poke VkDependencyInfo, dependencyFlags} |] ),
+	("memoryBarrierCount", ''#{type uint32_t},
+		[| #{peek VkDependencyInfo, memoryBarrierCount} |],
+		[| #{poke VkDependencyInfo, memoryBarrierCount} |] ),
+	("pMemoryBarriers", ''Memory.PtrBarrier2,
+		[| #{peek VkDependencyInfo, pMemoryBarriers} |],
+		[| #{poke VkDependencyInfo, pMemoryBarriers} |] ),
+	("bufferMemoryBarrierCount", ''#{type uint32_t},
+		[| #{peek VkDependencyInfo, bufferMemoryBarrierCount} |],
+		[| #{poke VkDependencyInfo, bufferMemoryBarrierCount} |]),
+	("pBufferMemoryBarriers", ''Buffer.PtrMemoryBarrier2,
+		[| #{peek VkDependencyInfo, pBufferMemoryBarriers} |],
+		[| #{poke VkDependencyInfo, pBufferMemoryBarriers} |]),
+	("imageMemoryBarrierCount", ''#{type uint32_t},
+		[| #{peek VkDependencyInfo, imageMemoryBarrierCount} |],
+		[| #{poke VkDependencyInfo, imageMemoryBarrierCount} |]),
+	("pImageMemoryBarriers", ''Image.PtrMemoryBarrier2,
+		[| #{peek VkDependencyInfo, pImageMemoryBarriers} |],
+		[| #{poke VkDependencyInfo, pImageMemoryBarriers} |]) ]
 	[''Show, ''Storable]
diff --git a/src/Gpu/Vulkan/Image/Core.hs-boot b/src/Gpu/Vulkan/Image/Core.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Gpu/Vulkan/Image/Core.hs-boot
@@ -0,0 +1,6 @@
+module Gpu.Vulkan.Image.Core where
+
+import Foreign.Ptr
+
+data MemoryBarrier2
+type PtrMemoryBarrier2 = Ptr MemoryBarrier2
diff --git a/src/Gpu/Vulkan/Image/Core.hsc b/src/Gpu/Vulkan/Image/Core.hsc
--- a/src/Gpu/Vulkan/Image/Core.hsc
+++ b/src/Gpu/Vulkan/Image/Core.hsc
@@ -28,6 +28,14 @@
 	memoryBarrierSrcQueueFamilyIndex, memoryBarrierDstQueueFamilyIndex,
 	memoryBarrierImage, memoryBarrierSubresourceRange,
 
+	MemoryBarrier2, PtrMemoryBarrier2, pattern MemoryBarrier2,
+	memoryBarrier2SType, memoryBarrier2PNext,
+	memoryBarrier2SrcStageMask, memoryBarrier2SrcAccessMask,
+	memoryBarrier2DstStageMask, memoryBarrier2DstAccessMask,
+	memoryBarrier2OldLayout, memoryBarrier2NewLayout,
+	memoryBarrier2SrcQueueFamilyIndex, memoryBarrier2DstQueueFamilyIndex,
+	memoryBarrier2Image, memoryBarrier2SubresourceRange,
+
 	-- ** SubresourceRange
 
 	SubresourceRange, pattern SubresourceRange,
@@ -188,6 +196,50 @@
 		[| #{peek VkImageMemoryBarrier, subresourceRange} |],
 		[| #{poke VkImageMemoryBarrier, subresourceRange} |]) ]
 	[''Show, ''Storable]
+
+mbType2 :: #{type VkStructureType}
+mbType2 = #{const VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2}
+
+struct "MemoryBarrier2" #{size VkImageMemoryBarrier2}
+		#{alignment VkImageMemoryBarrier2} [
+	("sType", ''(), [| const $ pure () |],
+		[| \p _ -> #{poke VkImageMemoryBarrier2, sType} p mbType2 |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkImageMemoryBarrier2, pNext} |],
+		[| #{poke VkImageMemoryBarrier2, pNext} |]),
+	("srcStageMask", ''#{type VkPipelineStageFlags2},
+		[| #{peek VkImageMemoryBarrier2, srcStageMask} |],
+		[| #{poke VkImageMemoryBarrier2, srcStageMask} |]),
+	("srcAccessMask", ''#{type VkAccessFlags2},
+		[| #{peek VkImageMemoryBarrier2, srcAccessMask} |],
+		[| #{poke VkImageMemoryBarrier2, srcAccessMask} |]),
+	("dstStageMask", ''#{type VkPipelineStageFlags2},
+		[| #{peek VkImageMemoryBarrier2, dstStageMask} |],
+		[| #{poke VkImageMemoryBarrier2, dstStageMask} |]),
+	("dstAccessMask", ''#{type VkAccessFlags2},
+		[| #{peek VkImageMemoryBarrier2, dstAccessMask} |],
+		[| #{poke VkImageMemoryBarrier2, dstAccessMask} |]),
+	("oldLayout", ''#{type VkImageLayout},
+		[| #{peek VkImageMemoryBarrier2, oldLayout} |],
+		[| #{poke VkImageMemoryBarrier2, oldLayout} |]),
+	("newLayout", ''#{type VkImageLayout},
+		[| #{peek VkImageMemoryBarrier2, newLayout} |],
+		[| #{poke VkImageMemoryBarrier2, newLayout} |]),
+	("srcQueueFamilyIndex", ''#{type uint32_t},
+		[| #{peek VkImageMemoryBarrier2, srcQueueFamilyIndex} |],
+		[| #{poke VkImageMemoryBarrier2, srcQueueFamilyIndex} |]),
+	("dstQueueFamilyIndex", ''#{type uint32_t},
+		[| #{peek VkImageMemoryBarrier2, dstQueueFamilyIndex} |],
+		[| #{poke VkImageMemoryBarrier2, dstQueueFamilyIndex} |]),
+	("image", ''I,
+		[| #{peek VkImageMemoryBarrier2, image} |],
+		[| #{poke VkImageMemoryBarrier2, image} |]),
+	("subresourceRange", ''SubresourceRange,
+		[| #{peek VkImageMemoryBarrier2, subresourceRange} |],
+		[| #{poke VkImageMemoryBarrier2, subresourceRange} |]) ]
+	[''Show, ''Storable]
+
+type PtrMemoryBarrier2 = Ptr MemoryBarrier2
 
 struct "SubresourceLayers" #{size VkImageSubresourceLayers}
 		#{alignment VkImageSubresourceLayers} [
diff --git a/src/Gpu/Vulkan/Memory/Core.hsc b/src/Gpu/Vulkan/Memory/Core.hsc
--- a/src/Gpu/Vulkan/Memory/Core.hsc
+++ b/src/Gpu/Vulkan/Memory/Core.hsc
@@ -31,8 +31,13 @@
 	-- * BARRIER
 
 	Barrier, pattern Barrier,
-	barrierSType, barrierPNext, barrierSrcAccessMask, barrierDstAccessMask
+	barrierSType, barrierPNext, barrierSrcAccessMask, barrierDstAccessMask,
 
+	Barrier2, PtrBarrier2, pattern Barrier2,
+	barrier2SType, barrier2PNext,
+	barrier2SrcStageMask, barrier2SrcAccessMask,
+	barrier2DstStageMask, barrier2DstAccessMask
+
 	) where
 
 import Prelude hiding (map)
@@ -139,3 +144,28 @@
 		[| #{peek VkMemoryBarrier, dstAccessMask} |],
 		[| #{poke VkMemoryBarrier, dstAccessMask} |]) ]
 	[''Show, ''Storable]
+
+bType2 :: #{type VkStructureType}
+bType2 = #{const VK_STRUCTURE_TYPE_MEMORY_BARRIER_2}
+
+struct "Barrier2" #{size VkMemoryBarrier2} #{alignment VkMemoryBarrier2} [
+	("sType", ''(), [| const $ pure () |],
+		[| \p _ -> #{poke VkMemoryBarrier2, sType} p bType2 |]),
+	("pNext", ''PtrVoid,
+		[| #{peek VkMemoryBarrier2, pNext} |],
+		[| #{poke VkMemoryBarrier2, pNext} |]),
+	("srcStageMask", ''#{type VkPipelineStageFlags2},
+		[| #{peek VkMemoryBarrier2, srcStageMask} |],
+		[| #{poke VkMemoryBarrier2, srcStageMask} |]),
+	("srcAccessMask", ''#{type VkAccessFlags2},
+		[| #{peek VkMemoryBarrier2, srcAccessMask} |],
+		[| #{poke VkMemoryBarrier2, srcAccessMask} |]),
+	("dstStageMask", ''#{type VkPipelineStageFlags2},
+		[| #{peek VkMemoryBarrier2, dstStageMask} |],
+		[| #{poke VkMemoryBarrier2, dstStageMask} |]),
+	("dstAccessMask", ''#{type VkAccessFlags2},
+		[| #{peek VkMemoryBarrier2, dstAccessMask} |],
+		[| #{poke VkMemoryBarrier2, dstAccessMask} |]) ]
+	[''Show, ''Storable]
+
+type PtrBarrier2 = Ptr Barrier2
