if ((info->intr_state.irq_pending == 1) && (guest_ctrl->guest_ctrl.V_IRQ == 0)) {
 
 #ifdef DEBUG_INTERRUPTS
+       PrintDebug("INTAK cycle completed for irq %d\n", info->intr_state.irq_vector);
+#endif
+
+       info->intr_state.irq_started = 1;
+       info->intr_state.irq_pending = 0;
+
+       v3_injecting_intr(info, info->intr_state.irq_vector, EXTERNAL_IRQ);
+    }
+
+    if ((info->intr_state.irq_started == 1) && (guest_ctrl->exit_int_info.valid == 0)) {
+#ifdef DEBUG_INTERRUPTS
        PrintDebug("Interrupt %d taken by guest\n", info->intr_state.irq_vector);
 #endif
-       if (!guest_ctrl->exit_int_info.valid) {
-           info->intr_state.irq_pending = 0;
-           // PrintDebug("Injected Interrupt %d\n", info->intr_state.irq_vector);
-           v3_injecting_intr(info, info->intr_state.irq_vector, EXTERNAL_IRQ);
-       } else {
+
+       // Interrupt was taken fully vectored
+       info->intr_state.irq_started = 0;
+
+    } else {
 #ifdef DEBUG_INTERRUPTS
-           PrintDebug("EXIT INT INFO is set (vec=%d)\n", guest_ctrl->exit_int_info.vector);
+       PrintDebug("EXIT INT INFO is set (vec=%d)\n", guest_ctrl->exit_int_info.vector);
 #endif
-       }
     }
 
 
                   (void *)(addr_t)info->rip);
 #endif
        v3_injecting_excp(info, excp);
-    } else if (info->intr_state.irq_pending == 1) {
+    } else if (info->intr_state.irq_started == 1) {
 #ifdef DEBUG_INTERRUPTS
        PrintDebug("IRQ pending from previous injection\n");
 #endif
 
 void v3_init_interrupt_state(struct guest_info * info) {
 
     info->intr_state.irq_pending = 0;
+    info->intr_state.irq_started = 0;
     info->intr_state.irq_vector = 0;
 
     INIT_LIST_HEAD(&(info->intr_state.controller_list));
     
     // Check if the guest has interrupts enabled
     if (flags->intr == 0) {
-       return 0;
+       //return 0;
     }
 
     list_for_each_entry(ctrl, &(intr_state->controller_list), ctrl_node) {