for (i = 0; i < 16; i++) {
     if (i <= 7) {
       if (((state->master_irr & ~(state->master_imr)) >> i) == 0x01) {
-       return i;
+       state->master_isr |= (0x1 << i);
+       return i + state->master_icw2;
       }
     } else {
       if (((state->slave_irr & ~(state->slave_imr)) >> i) == 0x01) {
-       return i;
+       state->slave_isr |= (0x1 << i);
+       return i + state->slave_icw2;
       }
     }
   }
 }
 
 
-static int begin_irq(void * private_data, int irq) {
+static int pic_begin_irq(void * private_data, int irq) {
 
   return 0;
 }
 
-static int end_irq(void * private_data, int irq) {
+/*
+static int pic_end_irq(void * private_data, int irq) {
 
   return 0;
 }
-
+*/
 
 static struct intr_ctrl_ops intr_ops = {
   .intr_pending = pic_intr_pending,
   .get_intr_number = pic_get_intr_number,
   .raise_intr = pic_raise_intr,
-  .begin_irq = begin_irq,
+  .begin_irq = pic_begin_irq,
 };
 
 
   } else if (state->master_state == READY) {
     if (IS_OCW2(cw)) {
       // handle the EOI here
-      struct ocw2 * cw2 =  (struct ocw2 *)cw;
+      struct ocw2 * cw2 =  (struct ocw2*)&cw;
       
       if ((cw2->EOI) && (!cw2->R) && (cw2->SL)) {
        // specific EOI;
        state->master_isr &= ~(0x01 << cw2->level);
+      } else if ((cw2->EOI) & (!cw2->R) && (!cw2->SL)) {
+       // Non-specific EOI
+       
       } else {
        // error;
       }
   } else if (state->slave_state == READY) {
     if (IS_OCW2(cw)) {
       // handle the EOI here
-      struct ocw2 * cw2 =  (struct ocw2 *)cw;
+      struct ocw2 * cw2 =  (struct ocw2 *)&cw;
       
       if ((cw2->EOI) && (!cw2->R) && (cw2->SL)) {
        // specific EOI;
        state->slave_isr &= ~(0x01 << cw2->level);
+      } else if ((cw2->EOI) & (!cw2->R) && (!cw2->SL)) {
+       // non specific EOI
       } else {
        // error;
       }
 
     os_hooks.free = &VMM_Free;
     os_hooks.vaddr_to_paddr = &Identity;
     os_hooks.paddr_to_vaddr = &Identity;
-
+    os_hooks.hook_interrupt = &hook_irq_stub;
+    os_hooks.ack_irq = &ack_irq;
  
     //   DumpGDT();
     Init_VMM(&os_hooks, &vmm_ops);