@Override
  public TickRateModulation tickingRequest(final IGridNode node, int ticksSinceLastCall) {
    if (this.inv.getStackInSlot(9) != null) {
      this.pushOut(this.inv.getStackInSlot(9));

      // did it eject?
      if (this.inv.getStackInSlot(9) == null) {
        this.markDirty();
      }

      this.ejectHeldItems();
      this.updateSleepiness();
      this.progress = 0;
      return this.isAwake ? TickRateModulation.IDLE : TickRateModulation.SLEEP;
    }

    if (this.myPlan == null) {
      this.updateSleepiness();
      return TickRateModulation.SLEEP;
    }

    if (this.reboot) {
      ticksSinceLastCall = 1;
    }

    if (!this.isAwake) {
      return TickRateModulation.SLEEP;
    }

    this.reboot = false;
    int speed = 10;
    switch (this.upgrades.getInstalledUpgrades(Upgrades.SPEED)) {
      case 0:
        this.progress += this.userPower(ticksSinceLastCall, speed = 10, 1.0);
        break;
      case 1:
        this.progress += this.userPower(ticksSinceLastCall, speed = 13, 1.3);
        break;
      case 2:
        this.progress += this.userPower(ticksSinceLastCall, speed = 17, 1.7);
        break;
      case 3:
        this.progress += this.userPower(ticksSinceLastCall, speed = 20, 2.0);
        break;
      case 4:
        this.progress += this.userPower(ticksSinceLastCall, speed = 25, 2.5);
        break;
      case 5:
        this.progress += this.userPower(ticksSinceLastCall, speed = 50, 5.0);
        break;
    }

    if (this.progress >= 100) {
      for (int x = 0; x < this.craftingInv.getSizeInventory(); x++) {
        this.craftingInv.setInventorySlotContents(x, this.inv.getStackInSlot(x));
      }

      this.progress = 0;
      final ItemStack output = this.myPlan.getOutput(this.craftingInv, this.getWorldObj());
      if (output != null) {
        FMLCommonHandler.instance()
            .firePlayerCraftingEvent(
                Platform.getPlayer((WorldServer) this.getWorldObj()), output, this.craftingInv);

        this.pushOut(output.copy());

        for (int x = 0; x < this.craftingInv.getSizeInventory(); x++) {
          this.inv.setInventorySlotContents(
              x, Platform.getContainerItem(this.craftingInv.getStackInSlot(x)));
        }

        if (this.inv.getStackInSlot(10) == null) {
          this.forcePlan = false;
          this.myPlan = null;
          this.pushDirection = ForgeDirection.UNKNOWN;
        }

        this.ejectHeldItems();

        try {
          final TargetPoint where =
              new TargetPoint(
                  this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord, 32);
          final IAEItemStack item = AEItemStack.create(output);
          NetworkHandler.instance.sendToAllAround(
              new PacketAssemblerAnimation(
                  this.xCoord, this.yCoord, this.zCoord, (byte) speed, item),
              where);
        } catch (final IOException e) {
          // ;P
        }

        this.markDirty();
        this.updateSleepiness();
        return this.isAwake ? TickRateModulation.IDLE : TickRateModulation.SLEEP;
      }
    }

    return TickRateModulation.FASTER;
  }