@Override
  public void setBlockState(BlockState blockState) {
    Validate.notNull(blockState, "blockState must not be null");
    TileEntity te = ((CraftBlockState) blockState).getTileEntity();
    Validate.notNull(te, "Invalid tile for " + blockState);

    boolean valid;
    switch (material) {
      case SIGN:
      case SIGN_POST:
      case WALL_SIGN:
        valid = te instanceof TileEntitySign;
        break;
      case CHEST:
      case TRAPPED_CHEST:
        valid = te instanceof TileEntityChest;
        break;
      case BURNING_FURNACE:
      case FURNACE:
        valid = te instanceof TileEntityFurnace;
        break;
      case DISPENSER:
        valid = te instanceof TileEntityDispenser;
        break;
      case DROPPER:
        valid = te instanceof TileEntityDropper;
        break;
      case END_GATEWAY:
        valid = te instanceof TileEntityEndGateway;
        break;
      case HOPPER:
        valid = te instanceof TileEntityHopper;
        break;
      case MOB_SPAWNER:
        valid = te instanceof TileEntityMobSpawner;
        break;
      case NOTE_BLOCK:
        valid = te instanceof TileEntityNote;
        break;
      case JUKEBOX:
        valid = te instanceof BlockJukeBox.TileEntityRecordPlayer;
        break;
      case BREWING_STAND_ITEM:
        valid = te instanceof TileEntityBrewingStand;
        break;
      case SKULL:
        valid = te instanceof TileEntitySkull;
        break;
      case COMMAND:
      case COMMAND_REPEATING:
      case COMMAND_CHAIN:
        valid = te instanceof TileEntityCommand;
        break;
      case BEACON:
        valid = te instanceof TileEntityBeacon;
        break;
      case SHIELD:
      case BANNER:
      case WALL_BANNER:
      case STANDING_BANNER:
        valid = te instanceof TileEntityBanner;
        break;
      case FLOWER_POT_ITEM:
        valid = te instanceof TileEntityFlowerPot;
        break;
      case STRUCTURE_BLOCK:
        valid = te instanceof TileEntityStructure;
        break;
      case WHITE_SHULKER_BOX:
      case ORANGE_SHULKER_BOX:
      case MAGENTA_SHULKER_BOX:
      case LIGHT_BLUE_SHULKER_BOX:
      case YELLOW_SHULKER_BOX:
      case LIME_SHULKER_BOX:
      case PINK_SHULKER_BOX:
      case GRAY_SHULKER_BOX:
      case SILVER_SHULKER_BOX:
      case CYAN_SHULKER_BOX:
      case PURPLE_SHULKER_BOX:
      case BLUE_SHULKER_BOX:
      case BROWN_SHULKER_BOX:
      case GREEN_SHULKER_BOX:
      case RED_SHULKER_BOX:
      case BLACK_SHULKER_BOX:
        valid = te instanceof TileEntityShulkerBox;
        break;
      case ENCHANTMENT_TABLE:
        valid = te instanceof TileEntityEnchantTable;
        break;
      case ENDER_CHEST:
        valid = te instanceof TileEntityEnderChest;
        break;
      case DAYLIGHT_DETECTOR:
      case DAYLIGHT_DETECTOR_INVERTED:
        valid = te instanceof TileEntityLightDetector;
        break;
      case REDSTONE_COMPARATOR:
        valid = te instanceof TileEntityComparator;
        break;
      default:
        valid = false;
        break;
    }

    Validate.isTrue(valid, "Invalid blockState for " + material);

    blockEntityTag = new NBTTagCompound();
    te.save(blockEntityTag);
  }