diff --git a/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt b/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt
index a3d32ae8..4fa4e767 100644
--- a/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt
+++ b/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt
@@ -2,13 +2,23 @@ package breadmod.block.entity
 
 import breadmod.ModMain.modTranslatable
 import breadmod.menu.block.SoundBlockMenu
+import breadmod.network.PacketHandler.NETWORK
+import breadmod.network.clientbound.CapabilitySideDataPacket
+import breadmod.network.clientbound.CapabilityTagDataPacket
 import breadmod.registry.block.ModBlockEntityTypes
+import breadmod.util.capability.CapabilityHolder
+import breadmod.util.capability.CapabilityHolder.Companion.ACCEPT_ALL
+import breadmod.util.capability.ICapabilitySavable
+import breadmod.util.capability.IndexableItemHandler
+import breadmod.util.capability.StorageDirection
 import net.minecraft.core.BlockPos
+import net.minecraft.core.Direction
 import net.minecraft.nbt.CompoundTag
 import net.minecraft.network.chat.Component
 import net.minecraft.network.protocol.Packet
 import net.minecraft.network.protocol.game.ClientGamePacketListener
 import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket
+import net.minecraft.server.level.ServerLevel
 import net.minecraft.sounds.SoundEvents
 import net.minecraft.world.MenuProvider
 import net.minecraft.world.entity.player.Inventory
@@ -18,6 +28,11 @@ import net.minecraft.world.item.BlockItem
 import net.minecraft.world.item.ItemStack
 import net.minecraft.world.level.block.entity.BlockEntity
 import net.minecraft.world.level.block.state.BlockState
+import net.minecraft.world.level.block.state.properties.BlockStateProperties
+import net.minecraftforge.common.capabilities.Capability
+import net.minecraftforge.common.capabilities.ForgeCapabilities
+import net.minecraftforge.common.util.LazyOptional
+import net.minecraftforge.network.PacketDistributor
 
 // todo actual logic and packet for handling entered sounds
 class SoundBlockEntity(
@@ -28,18 +43,69 @@ class SoundBlockEntity(
     pPos,
     pBlockState
 ), MenuProvider {
+    val capabilityHolder = CapabilityHolder(mapOf(
+        ForgeCapabilities.ITEM_HANDLER to (
+                IndexableItemHandler(
+                    listOf(
+                        1 to StorageDirection.STORE_ONLY
+                    )
+                ) to ACCEPT_ALL
+        )
+    ))
+
+    init {
+        capabilityHolder.capabilities.forEach { _, u ->
+            u.first.ifPresent { it.changed = { setChanged() } }
+        }
+        capabilityHolder.changed = { cap, _, _ ->
+            NETWORK.send(
+                PacketDistributor.TRACKING_CHUNK.with { (level as ServerLevel).getChunkAt(blockPos) },
+                CapabilitySideDataPacket(blockPos, cap.name, capabilityHolder.capabilities[cap]?.second ?: emptyList())
+            )
+        }
+        capabilityHolder.capabilities.forEach {
+            (capabilityHolder.capability(it.key) as ICapabilitySavable<*>).changed = ::setChanged
+        }
+    }
+
+    override fun <T : Any?> getCapability(cap: Capability<T>): LazyOptional<T> =
+        getCapability(cap, null)
+
+    override fun <T : Any?> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> =
+        capabilityHolder.capabilitySided(cap, blockState.getValue(BlockStateProperties.HORIZONTAL_FACING), side)
+            ?: super.getCapability(cap, side)
+
+    override fun invalidateCaps() {
+        capabilityHolder.invalidate()
+        super.invalidateCaps()
+    }
+
     var currentSound: String? = SoundEvents.BELL_BLOCK.location.path
 
     override fun saveAdditional(pTag: CompoundTag) {
+        capabilityHolder.capabilities.forEach { (cap, list) ->
+            list.first.ifPresent { pTag.put(cap.name, it.serializeNBT()) }
+        }
         currentSound?.let { pTag.putString("current_sound", it) }
         super.saveAdditional(pTag)
     }
 
     override fun load(pTag: CompoundTag) {
+        capabilityHolder.capabilities.forEach { (cap, list) ->
+            list.first.ifPresent { it.deserializeNBT(pTag.get(cap.name)) }
+        }
         if (currentSound != null) pTag.getCompound("current_sound")
         super.load(pTag)
     }
 
+    override fun setChanged() {
+        if (level is ServerLevel) NETWORK.send(
+            PacketDistributor.TRACKING_CHUNK.with { (level as ServerLevel).getChunkAt(blockPos) },
+            CapabilityTagDataPacket(blockPos, updateTag)
+        )
+        super.setChanged()
+    }
+
     override fun saveToItem(pStack: ItemStack) =
         BlockItem.setBlockEntityData(pStack, type, saveWithFullMetadata())
 
diff --git a/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt b/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt
index 0fb9f34c..b6752f83 100644
--- a/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt
+++ b/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt
@@ -4,10 +4,13 @@ import breadmod.block.entity.SoundBlockEntity
 import breadmod.menu.AbstractModContainerMenu
 import breadmod.registry.block.ModBlockEntityTypes
 import breadmod.registry.menu.ModMenuTypes
+import breadmod.util.capability.IndexableItemHandler
 import net.minecraft.network.FriendlyByteBuf
 import net.minecraft.world.entity.player.Inventory
 import net.minecraft.world.entity.player.Player
 import net.minecraft.world.inventory.ContainerLevelAccess
+import net.minecraft.world.inventory.Slot
+import net.minecraftforge.common.capabilities.ForgeCapabilities
 
 class SoundBlockMenu(
     pContainerId: Int,
@@ -23,7 +26,9 @@ class SoundBlockMenu(
     )
 
     init {
+        val cap = parent.capabilityHolder.capabilityOrNull<IndexableItemHandler>(ForgeCapabilities.ITEM_HANDLER)
         addInventorySlots(pInventory, 8, 142, 84)
+        addSlot(Slot(TODO(), 1, 0, 0))
     }
 
     override fun stillValid(pPlayer: Player): Boolean = stillValid(
diff --git a/src/main/kotlin/breadmod/network/serverbound/SoundBlockPacket.kt b/src/main/kotlin/breadmod/network/serverbound/SoundBlockPacket.kt
new file mode 100644
index 00000000..49c6dc07
--- /dev/null
+++ b/src/main/kotlin/breadmod/network/serverbound/SoundBlockPacket.kt
@@ -0,0 +1,4 @@
+package breadmod.network.serverbound
+
+object SoundBlockPacket {
+}
\ No newline at end of file