diff --git a/src/main/java/dan200/computercraft/client/ClientRegistry.java b/src/main/java/dan200/computercraft/client/ClientRegistry.java
index fccf3f0de..f1629b070 100644
--- a/src/main/java/dan200/computercraft/client/ClientRegistry.java
+++ b/src/main/java/dan200/computercraft/client/ClientRegistry.java
@@ -13,11 +13,10 @@ import dan200.computercraft.client.render.TurtleModelLoader;
 import dan200.computercraft.client.render.TurtlePlayerRenderer;
 import dan200.computercraft.shared.Registry;
 import dan200.computercraft.shared.common.IColouredItem;
-import dan200.computercraft.shared.computer.inventory.ContainerComputer;
+import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
 import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
 import dan200.computercraft.shared.media.items.ItemDisk;
 import dan200.computercraft.shared.media.items.ItemTreasureDisk;
-import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
 import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 import dan200.computercraft.shared.util.Colour;
 import net.minecraft.client.gui.ScreenManager;
@@ -168,8 +167,9 @@ public final class ClientRegistry
     {
         // My IDE doesn't think so, but we do actually need these generics.
 
-        ScreenManager.<ContainerComputer, GuiComputer<ContainerComputer>>register( Registry.ModContainers.COMPUTER.get(), GuiComputer::create );
-        ScreenManager.<ContainerPocketComputer, GuiComputer<ContainerPocketComputer>>register( Registry.ModContainers.POCKET_COMPUTER.get(), GuiComputer::createPocket );
+        ScreenManager.<ContainerComputerBase, GuiComputer<ContainerComputerBase>>register( Registry.ModContainers.COMPUTER.get(), GuiComputer::create );
+        ScreenManager.<ContainerComputerBase, GuiComputer<ContainerComputerBase>>register( Registry.ModContainers.POCKET_COMPUTER.get(), GuiComputer::createPocket );
+        ScreenManager.<ContainerComputerBase, NoTermComputerScreen<ContainerComputerBase>>register( Registry.ModContainers.POCKET_COMPUTER_NO_TERM.get(), NoTermComputerScreen::new );
         ScreenManager.register( Registry.ModContainers.TURTLE.get(), GuiTurtle::new );
 
         ScreenManager.register( Registry.ModContainers.PRINTER.get(), GuiPrinter::new );
diff --git a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java
index 05164cb67..6d3404632 100644
--- a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java
+++ b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java
@@ -11,10 +11,8 @@ import dan200.computercraft.ComputerCraft;
 import dan200.computercraft.client.gui.widgets.ComputerSidebar;
 import dan200.computercraft.client.gui.widgets.WidgetTerminal;
 import dan200.computercraft.client.render.ComputerBorderRenderer;
-import dan200.computercraft.shared.computer.inventory.ContainerComputer;
 import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
 import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
-import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.util.text.ITextComponent;
 
@@ -39,7 +37,7 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Computer
         imageHeight = WidgetTerminal.getHeight( termHeight ) + BORDER * 2;
     }
 
-    public static GuiComputer<ContainerComputer> create( ContainerComputer container, PlayerInventory inventory, ITextComponent component )
+    public static GuiComputer<ContainerComputerBase> create( ContainerComputerBase container, PlayerInventory inventory, ITextComponent component )
     {
         return new GuiComputer<>(
             container, inventory, component,
@@ -47,7 +45,7 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Computer
         );
     }
 
-    public static GuiComputer<ContainerPocketComputer> createPocket( ContainerPocketComputer container, PlayerInventory inventory, ITextComponent component )
+    public static GuiComputer<ContainerComputerBase> createPocket( ContainerComputerBase container, PlayerInventory inventory, ITextComponent component )
     {
         return new GuiComputer<>(
             container, inventory, component,
diff --git a/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java b/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java
new file mode 100644
index 000000000..ca1edee7a
--- /dev/null
+++ b/src/main/java/dan200/computercraft/client/gui/NoTermComputerScreen.java
@@ -0,0 +1,108 @@
+/*
+ * This file is part of ComputerCraft - http://www.computercraft.info
+ * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
+ * Send enquiries to dratcliffe@gmail.com
+ */
+package dan200.computercraft.client.gui;
+
+import com.mojang.blaze3d.matrix.MatrixStack;
+import dan200.computercraft.ComputerCraft;
+import dan200.computercraft.client.gui.widgets.WidgetTerminal;
+import dan200.computercraft.shared.computer.core.ClientComputer;
+import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.IHasContainer;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.util.IReorderingProcessor;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraft.util.text.TranslationTextComponent;
+import org.lwjgl.glfw.GLFW;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class NoTermComputerScreen<T extends ContainerComputerBase> extends Screen implements IHasContainer<T>
+{
+    private final T menu;
+    private WidgetTerminal terminal;
+
+    public NoTermComputerScreen( T menu, PlayerInventory player, ITextComponent title )
+    {
+        super( title );
+        this.menu = menu;
+    }
+
+    @Nonnull
+    @Override
+    public T getMenu()
+    {
+        return menu;
+    }
+
+    @Override
+    protected void init()
+    {
+        super.init();
+        minecraft.keyboardHandler.setSendRepeatsToGui( true );
+
+        terminal = addWidget( new WidgetTerminal( (ClientComputer) menu.getComputer(), 0, 0, ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight ) );
+        terminal.visible = false;
+        terminal.active = false;
+        setFocused( terminal );
+    }
+
+    @Override
+    public final void removed()
+    {
+        super.removed();
+        minecraft.keyboardHandler.setSendRepeatsToGui( false );
+    }
+
+    @Override
+    public final void tick()
+    {
+        super.tick();
+        terminal.update();
+    }
+
+    @Override
+    public void onClose()
+    {
+        minecraft.player.closeContainer();
+        super.onClose();
+    }
+
+    @Override
+    public boolean isPauseScreen()
+    {
+        return false;
+    }
+
+    @Override
+    public final boolean keyPressed( int key, int scancode, int modifiers )
+    {
+        // Forward the tab key to the terminal, rather than moving between controls.
+        if( key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminal )
+        {
+            return getFocused().keyPressed( key, scancode, modifiers );
+        }
+
+        return super.keyPressed( key, scancode, modifiers );
+    }
+
+    @Override
+    public void render( MatrixStack transform, int mouseX, int mouseY, float partialTicks )
+    {
+        super.render( transform, mouseX, mouseY, partialTicks );
+
+        FontRenderer font = minecraft.font;
+        List<IReorderingProcessor> lines = font.split( new TranslationTextComponent( "gui.computercraft.pocket_computer_overlay" ), (int) (width * 0.8) );
+        float y = 10.0f;
+        for( IReorderingProcessor line : lines )
+        {
+            font.drawShadow( transform, line, (float) ((width / 2) - (minecraft.font.width( line ) / 2)), y, 0xFFFFFF );
+            y += 9.0f;
+        }
+    }
+}
diff --git a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java
index ead0fd81d..19b1da7d1 100644
--- a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java
+++ b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java
@@ -311,6 +311,7 @@ public class WidgetTerminal extends Widget
     @Override
     public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks )
     {
+        if( !visible ) return;
         Matrix4f matrix = transform.last().pose();
         Terminal terminal = computer.getTerminal();
         if( terminal != null )
diff --git a/src/main/java/dan200/computercraft/shared/Registry.java b/src/main/java/dan200/computercraft/shared/Registry.java
index 4b18fa6b8..ed8053cce 100644
--- a/src/main/java/dan200/computercraft/shared/Registry.java
+++ b/src/main/java/dan200/computercraft/shared/Registry.java
@@ -18,7 +18,7 @@ import dan200.computercraft.shared.computer.blocks.BlockComputer;
 import dan200.computercraft.shared.computer.blocks.TileCommandComputer;
 import dan200.computercraft.shared.computer.blocks.TileComputer;
 import dan200.computercraft.shared.computer.core.ComputerFamily;
-import dan200.computercraft.shared.computer.inventory.ContainerComputer;
+import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
 import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
 import dan200.computercraft.shared.computer.items.ItemComputer;
 import dan200.computercraft.shared.computer.recipe.ComputerUpgradeRecipe;
@@ -53,7 +53,6 @@ import dan200.computercraft.shared.peripheral.printer.ContainerPrinter;
 import dan200.computercraft.shared.peripheral.printer.TilePrinter;
 import dan200.computercraft.shared.peripheral.speaker.BlockSpeaker;
 import dan200.computercraft.shared.peripheral.speaker.TileSpeaker;
-import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
 import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
 import dan200.computercraft.shared.pocket.peripherals.PocketModem;
 import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
@@ -312,11 +311,14 @@ public final class Registry
     {
         static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID );
 
-        public static final RegistryObject<ContainerType<ContainerComputer>> COMPUTER = CONTAINERS.register( "computer",
-            () -> ContainerData.toType( ComputerContainerData::new, ContainerComputer::new ) );
+        public static final RegistryObject<ContainerType<ContainerComputerBase>> COMPUTER = CONTAINERS.register( "computer",
+            () -> ContainerData.toType( ComputerContainerData::new, ContainerComputerBase::new ) );
 
-        public static final RegistryObject<ContainerType<ContainerPocketComputer>> POCKET_COMPUTER = CONTAINERS.register( "pocket_computer",
-            () -> ContainerData.toType( ComputerContainerData::new, ContainerPocketComputer::new ) );
+        public static final RegistryObject<ContainerType<ContainerComputerBase>> POCKET_COMPUTER = CONTAINERS.register( "pocket_computer",
+            () -> ContainerData.toType( ComputerContainerData::new, ContainerComputerBase::new ) );
+
+        public static final RegistryObject<ContainerType<ContainerComputerBase>> POCKET_COMPUTER_NO_TERM = CONTAINERS.register( "pocket_computer_no_term",
+            () -> ContainerData.toType( ComputerContainerData::new, ContainerComputerBase::new ) );
 
         public static final RegistryObject<ContainerType<ContainerTurtle>> TURTLE = CONTAINERS.register( "turtle",
             () -> ContainerData.toType( ComputerContainerData::new, ContainerTurtle::new ) );
diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java
index 23a4a7d6f..eb92fdfbe 100644
--- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java
+++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java
@@ -8,10 +8,11 @@ package dan200.computercraft.shared.computer.blocks;
 import dan200.computercraft.ComputerCraft;
 import dan200.computercraft.api.peripheral.IPeripheral;
 import dan200.computercraft.core.computer.ComputerSide;
+import dan200.computercraft.shared.Registry;
 import dan200.computercraft.shared.computer.core.ComputerFamily;
 import dan200.computercraft.shared.computer.core.ComputerState;
 import dan200.computercraft.shared.computer.core.ServerComputer;
-import dan200.computercraft.shared.computer.inventory.ContainerComputer;
+import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
 import dan200.computercraft.shared.util.CapabilityUtil;
 import net.minecraft.block.BlockState;
 import net.minecraft.entity.player.PlayerEntity;
@@ -50,7 +51,7 @@ public class TileComputer extends TileComputerBase
         return computer;
     }
 
-    public boolean isUsableByPlayer( PlayerEntity player )
+    protected boolean isUsableByPlayer( PlayerEntity player )
     {
         return isUsable( player, false );
     }
@@ -85,7 +86,7 @@ public class TileComputer extends TileComputerBase
     @Override
     public Container createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity player )
     {
-        return new ContainerComputer( id, this );
+        return new ContainerComputerBase( Registry.ModContainers.COMPUTER.get(), id, this::isUsableByPlayer, createServerComputer(), getFamily() );
     }
 
     @Nonnull
diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputer.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputer.java
deleted file mode 100644
index f2ead9dad..000000000
--- a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * This file is part of ComputerCraft - http://www.computercraft.info
- * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
- * Send enquiries to dratcliffe@gmail.com
- */
-package dan200.computercraft.shared.computer.inventory;
-
-import dan200.computercraft.shared.Registry;
-import dan200.computercraft.shared.computer.blocks.TileComputer;
-import dan200.computercraft.shared.network.container.ComputerContainerData;
-import net.minecraft.entity.player.PlayerInventory;
-
-public class ContainerComputer extends ContainerComputerBase
-{
-    public ContainerComputer( int id, TileComputer tile )
-    {
-        super( Registry.ModContainers.COMPUTER.get(), id, tile::isUsableByPlayer, tile.createServerComputer(), tile.getFamily() );
-    }
-
-    public ContainerComputer( int id, PlayerInventory player, ComputerContainerData data )
-    {
-        super( Registry.ModContainers.COMPUTER.get(), id, player, data );
-    }
-}
diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java
index 0ff641c57..5dd47c15e 100644
--- a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java
+++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java
@@ -46,7 +46,7 @@ public class ContainerComputerBase extends Container implements IContainerComput
     private UUID toUploadId;
     private List<FileUpload> toUpload;
 
-    protected ContainerComputerBase( ContainerType<? extends ContainerComputerBase> type, int id, Predicate<PlayerEntity> canUse, IComputer computer, ComputerFamily family )
+    public ContainerComputerBase( ContainerType<? extends ContainerComputerBase> type, int id, Predicate<PlayerEntity> canUse, IComputer computer, ComputerFamily family )
     {
         super( type, id );
         this.canUse = canUse;
@@ -54,7 +54,7 @@ public class ContainerComputerBase extends Container implements IContainerComput
         this.family = family;
     }
 
-    protected ContainerComputerBase( ContainerType<? extends ContainerComputerBase> type, int id, PlayerInventory player, ComputerContainerData data )
+    public ContainerComputerBase( ContainerType<? extends ContainerComputerBase> type, int id, PlayerInventory player, ComputerContainerData data )
     {
         this( type, id, x -> true, getComputer( player, data ), data.getFamily() );
     }
diff --git a/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java b/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java
index 90787fc0f..fd81d78b3 100644
--- a/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java
+++ b/src/main/java/dan200/computercraft/shared/network/container/ContainerData.java
@@ -13,6 +13,7 @@ import net.minecraft.inventory.container.ContainerType;
 import net.minecraft.inventory.container.INamedContainerProvider;
 import net.minecraft.network.PacketBuffer;
 import net.minecraftforge.common.extensions.IForgeContainerType;
+import net.minecraftforge.fml.network.IContainerFactory;
 import net.minecraftforge.fml.network.NetworkHooks;
 
 import javax.annotation.Nonnull;
@@ -37,8 +38,36 @@ public interface ContainerData
         return IForgeContainerType.create( ( id, player, data ) -> factory.create( id, player, reader.apply( data ) ) );
     }
 
+    static <C extends Container, T extends ContainerData> ContainerType<C> toType( Function<PacketBuffer, T> reader, FixedFactory<C, T> factory )
+    {
+        return new FixedPointContainerFactory<>( reader, factory ).type;
+    }
+
     interface Factory<C extends Container, T extends ContainerData>
     {
         C create( int id, @Nonnull PlayerInventory inventory, T data );
     }
+
+    interface FixedFactory<C extends Container, T extends ContainerData>
+    {
+        C create( ContainerType<C> type, int id, @Nonnull PlayerInventory inventory, T data );
+    }
+
+    class FixedPointContainerFactory<C extends Container, T extends ContainerData> implements IContainerFactory<C>
+    {
+        private final IContainerFactory<C> impl;
+        private final ContainerType<C> type;
+
+        private FixedPointContainerFactory( Function<PacketBuffer, T> reader, FixedFactory<C, T> factory )
+        {
+            ContainerType<C> type = this.type = IForgeContainerType.create( this );
+            impl = ( id, player, data ) -> factory.create( type, id, player, reader.apply( data ) );
+        }
+
+        @Override
+        public C create( int windowId, PlayerInventory inv, PacketBuffer data )
+        {
+            return impl.create( windowId, inv, data );
+        }
+    }
 }
diff --git a/src/main/java/dan200/computercraft/shared/pocket/inventory/ContainerPocketComputer.java b/src/main/java/dan200/computercraft/shared/pocket/inventory/ContainerPocketComputer.java
deleted file mode 100644
index 3cf67f103..000000000
--- a/src/main/java/dan200/computercraft/shared/pocket/inventory/ContainerPocketComputer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * This file is part of ComputerCraft - http://www.computercraft.info
- * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
- * Send enquiries to dratcliffe@gmail.com
- */
-package dan200.computercraft.shared.pocket.inventory;
-
-import dan200.computercraft.shared.Registry;
-import dan200.computercraft.shared.computer.core.ServerComputer;
-import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
-import dan200.computercraft.shared.network.container.ComputerContainerData;
-import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
-import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.entity.player.PlayerInventory;
-import net.minecraft.inventory.container.Container;
-import net.minecraft.inventory.container.INamedContainerProvider;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.Hand;
-import net.minecraft.util.text.ITextComponent;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-public final class ContainerPocketComputer extends ContainerComputerBase
-{
-    private ContainerPocketComputer( int id, ServerComputer computer, ItemPocketComputer item, Hand hand )
-    {
-        super( Registry.ModContainers.POCKET_COMPUTER.get(), id, p -> {
-            ItemStack stack = p.getItemInHand( hand );
-            return stack.getItem() == item && ItemPocketComputer.getServerComputer( stack ) == computer;
-        }, computer, item.getFamily() );
-    }
-
-    public ContainerPocketComputer( int id, PlayerInventory player, ComputerContainerData data )
-    {
-        super( Registry.ModContainers.POCKET_COMPUTER.get(), id, player, data );
-    }
-
-    public static class Factory implements INamedContainerProvider
-    {
-        private final ServerComputer computer;
-        private final ITextComponent name;
-        private final ItemPocketComputer item;
-        private final Hand hand;
-
-        public Factory( ServerComputer computer, ItemStack stack, ItemPocketComputer item, Hand hand )
-        {
-            this.computer = computer;
-            name = stack.getHoverName();
-            this.item = item;
-            this.hand = hand;
-        }
-
-
-        @Nonnull
-        @Override
-        public ITextComponent getDisplayName()
-        {
-            return name;
-        }
-
-        @Nullable
-        @Override
-        public Container createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity entity )
-        {
-            return new ContainerPocketComputer( id, computer, item, hand );
-        }
-    }
-}
diff --git a/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java b/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java
new file mode 100644
index 000000000..0a08ece1a
--- /dev/null
+++ b/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java
@@ -0,0 +1,61 @@
+/*
+ * This file is part of ComputerCraft - http://www.computercraft.info
+ * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
+ * Send enquiries to dratcliffe@gmail.com
+ */
+package dan200.computercraft.shared.pocket.inventory;
+
+import dan200.computercraft.shared.Registry;
+import dan200.computercraft.shared.computer.core.ServerComputer;
+import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
+import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.inventory.container.Container;
+import net.minecraft.inventory.container.INamedContainerProvider;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Hand;
+import net.minecraft.util.text.ITextComponent;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class PocketComputerMenuProvider implements INamedContainerProvider
+{
+    private final ServerComputer computer;
+    private final ITextComponent name;
+    private final ItemPocketComputer item;
+    private final Hand hand;
+    private final boolean isTypingOnly;
+
+    public PocketComputerMenuProvider( ServerComputer computer, ItemStack stack, ItemPocketComputer item, Hand hand, boolean isTypingOnly )
+    {
+        this.computer = computer;
+        name = stack.getHoverName();
+        this.item = item;
+        this.hand = hand;
+        this.isTypingOnly = isTypingOnly;
+    }
+
+
+    @Nonnull
+    @Override
+    public ITextComponent getDisplayName()
+    {
+        return name;
+    }
+
+    @Nullable
+    @Override
+    public Container createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity entity )
+    {
+        return new ContainerComputerBase(
+            isTypingOnly ? Registry.ModContainers.POCKET_COMPUTER_NO_TERM.get() : Registry.ModContainers.POCKET_COMPUTER.get(), id,
+            p -> {
+                ItemStack stack = p.getItemInHand( hand );
+                return stack.getItem() == item && ItemPocketComputer.getServerComputer( stack ) == computer;
+            },
+            computer, item.getFamily()
+        );
+    }
+}
diff --git a/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java b/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java
index b029d90e6..b937877a8 100644
--- a/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java
+++ b/src/main/java/dan200/computercraft/shared/pocket/items/ItemPocketComputer.java
@@ -22,7 +22,7 @@ import dan200.computercraft.shared.computer.items.IComputerItem;
 import dan200.computercraft.shared.network.container.ComputerContainerData;
 import dan200.computercraft.shared.pocket.apis.PocketAPI;
 import dan200.computercraft.shared.pocket.core.PocketServerComputer;
-import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
+import dan200.computercraft.shared.pocket.inventory.PocketComputerMenuProvider;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.PlayerEntity;
@@ -154,7 +154,8 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
 
             if( !stop && computer != null )
             {
-                new ComputerContainerData( computer ).open( player, new ContainerPocketComputer.Factory( computer, stack, this, hand ) );
+                boolean isTypingOnly = hand == Hand.OFF_HAND;
+                new ComputerContainerData( computer ).open( player, new PocketComputerMenuProvider( computer, stack, this, hand, isTypingOnly ) );
             }
         }
         return new ActionResult<>( ActionResultType.SUCCESS, stack );
diff --git a/src/main/resources/assets/computercraft/lang/en_us.json b/src/main/resources/assets/computercraft/lang/en_us.json
index 5d10c6607..e19fd33e6 100644
--- a/src/main/resources/assets/computercraft/lang/en_us.json
+++ b/src/main/resources/assets/computercraft/lang/en_us.json
@@ -130,5 +130,6 @@
     "gui.computercraft.upload.failed.corrupted": "Files corrupted when uploading. Please try again.",
     "gui.computercraft.upload.overwrite": "Files would be overwritten",
     "gui.computercraft.upload.overwrite.detail": "The following files will be overwritten when uploading. Continue?%s",
-    "gui.computercraft.upload.overwrite_button": "Overwrite"
+    "gui.computercraft.upload.overwrite_button": "Overwrite",
+    "gui.computercraft.pocket_computer_overlay": "Pocket computer open. Press ESC to close."
 }