@Override
  public boolean postStateTransitionEvent(
      State oldState,
      Event event,
      State newState,
      VirtualMachine vm,
      boolean status,
      Object opaque) {
    if (!status) {
      return false;
    }
    @SuppressWarnings("unchecked")
    Pair<Long, Long> hosts = (Pair<Long, Long>) opaque;
    Long oldHostId = hosts.first();

    s_logger.debug(
        "VM state transitted from :"
            + oldState
            + " to "
            + newState
            + " with event: "
            + event
            + "vm's original host id: "
            + vm.getLastHostId()
            + " new host id: "
            + vm.getHostId()
            + " host id before state transition: "
            + oldHostId);

    if (oldState == State.Starting) {
      if (newState != State.Running) {
        releaseVmCapacity(vm, false, false, oldHostId);
      }
    } else if (oldState == State.Running) {
      if (event == Event.AgentReportStopped) {
        releaseVmCapacity(vm, false, true, oldHostId);
      } else if (event == Event.AgentReportMigrated) {
        releaseVmCapacity(vm, false, false, oldHostId);
      }
    } else if (oldState == State.Migrating) {
      if (event == Event.AgentReportStopped) {
        /* Release capacity from original host */
        releaseVmCapacity(vm, false, false, vm.getLastHostId());
        releaseVmCapacity(vm, false, false, oldHostId);
      } else if (event == Event.OperationFailed) {
        /* Release from dest host */
        releaseVmCapacity(vm, false, false, oldHostId);
      } else if (event == Event.OperationSucceeded) {
        releaseVmCapacity(vm, false, false, vm.getLastHostId());
      }
    } else if (oldState == State.Stopping) {
      if (event == Event.OperationSucceeded) {
        releaseVmCapacity(vm, false, true, oldHostId);
      } else if (event == Event.AgentReportStopped) {
        releaseVmCapacity(vm, false, false, oldHostId);
      } else if (event == Event.AgentReportMigrated) {
        releaseVmCapacity(vm, false, false, oldHostId);
      }
    } else if (oldState == State.Stopped) {
      if (event == Event.DestroyRequested || event == Event.ExpungeOperation) {
        releaseVmCapacity(vm, true, false, vm.getLastHostId());
      } else if (event == Event.AgentReportMigrated) {
        releaseVmCapacity(vm, false, false, oldHostId);
      }
    }

    if ((newState == State.Starting
            || newState == State.Migrating
            || event == Event.AgentReportMigrated)
        && vm.getHostId() != null) {
      boolean fromLastHost = false;
      if (vm.getLastHostId() == vm.getHostId()) {
        s_logger.debug("VM starting again on the last host it was stopped on");
        fromLastHost = true;
      }
      allocateVmCapacity(vm, fromLastHost);
    }

    return true;
  }