diff --git a/src/main/scala/uk/ac/soton/ecs/can/core/CanCore.scala b/src/main/scala/uk/ac/soton/ecs/can/core/CanCore.scala
index 1e9ee71d87e61f23f436564dbe13b79518de2d60..6da51380bf2b628a544d1dcb42e608b7a6aecc15 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/core/CanCore.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/core/CanCore.scala
@@ -46,10 +46,7 @@ class CanCore(implicit cfg: CanCoreConfiguration) extends MultiIOModule {
 
   private val ctrl = programMemory.read.data.asTypeOf(new CanCoreControlWord)
 
-  programMemory.br.abs := ctrl.absoluteBranch
-  programMemory.br.rel := ctrl.relativeBranch
-  programMemory.br.addr := ctrl.immediate
-  programMemory.take := io.take
+  programMemory.halt := Mux(io.take, io.take, ctrl.halt)
 
   dataMemory.read.addr := Mux(
     io.take,
diff --git a/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala b/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala
index 1f96ea5823f1bcd3f7d0d777524090a649eba944..5cc4271c4c0621687cee18c7f36d623f60419c75 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala
@@ -12,12 +12,7 @@ class ProgramMemory(implicit cfg: CanCoreConfiguration) extends MultiIOModule {
   private val addrWidth = log2Ceil(cfg.programMemoryWords)
   private val cwWidth = (new CanCoreControlWord).getWidth
 
-  val br = IO(new Bundle {
-    val abs = Input(Bool())
-    val rel = Input(Bool())
-    val addr = Input(UInt(addrWidth.W))
-  })
-  val take = IO(Input(Bool()))
+  val halt = IO(Input(Bool()))
 
   val read = IO(new MemoryReadIO(addrWidth, cwWidth))
   val write = IO(new MemoryWriteIO(addrWidth, cwWidth))
@@ -34,21 +29,9 @@ class ProgramMemory(implicit cfg: CanCoreConfiguration) extends MultiIOModule {
 
   private val pc = RegInit(0.U(addrWidth.W))
 
-  pc := Mux(
-    take,
-    pc,
-    Mux(
-      br.abs,
-      br.addr.asUInt(),
-      Mux(
-        br.rel,
-        (pc.asSInt() + br.addr.asSInt()).asUInt(),
-        pc + 1.U
-      )
-    )
-  )
+  pc := Mux(halt, pc, pc + 1.U)
 
-  read.data := mem(Mux(take, read.addr, pc))
+  read.data := mem(Mux(halt, read.addr, pc))
 
   when(write.en) {
     mem(write.addr) := write.data
diff --git a/src/main/scala/uk/ac/soton/ecs/can/types/CanCoreControlWord.scala b/src/main/scala/uk/ac/soton/ecs/can/types/CanCoreControlWord.scala
index 0ccc8e55c8245d70776569ce2278b61cb080c692..d6845a5e5a7f3b7a52a36114c88750071cefa238 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/types/CanCoreControlWord.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/types/CanCoreControlWord.scala
@@ -12,9 +12,7 @@ class CanCoreControlWord(implicit val cfg: CanCoreConfiguration)
   private val dataMemoryAddressWidth = log2Ceil(cfg.dataMemoryWords)
   private val registerFileAddressWidth = log2Ceil(cfg.registerFileWords)
 
-  val immediate = UInt(cfg.immediateWidth.W)
-  val absoluteBranch = Bool()
-  val relativeBranch = Bool()
+  val halt = Bool()
 
   val dataMemoryReadAddress = UInt(dataMemoryAddressWidth.W)
   val dataMemoryWriteEnable = Bool()