public function init()
    {
        // Update slug
        $slug = Helpers::urlize($this->getModel()->getSlug());
        $this->getModel()->setSlug($slug);

        // Check forbidden slugs
        if (in_array($slug, $this->forbidden_slugs)) {
            throw new TermException(Translate::t('term.errors.slug_is_forbidden'));
        }

        // Check post type association
        $posttype = $this->getModel()->getPosttype();

        // Association with post by default
        if (!$posttype) {
            $this->getModel()->setPosttype('post');
        }

        // Update args on terms except reserved ones
        if (!in_array($slug, $this->reserved_slugs)) {
            // Check if term already exists
            if (term_exists($slug)) {
                throw new TermException(Translate::t('term.errors.slug_already_exists'));
            }

            $args = (array) $this->getModel()->getArgs();
            $labels = (array) $this->getModel()->getLabels();

            // Initialize plural and singular vars
            $labels['name'] = isset($labels['name']) ? $labels['name'] : '';
            $labels['singular_name'] = isset($labels['singular_name']) ? $labels['singular_name'] : '';

            // Check label for all except reserved ones
            if (empty($labels['name']) || empty($labels['singular_name'])) {
                throw new TermException(Translate::t('term.errors.missing_singular_or_plural'));
            }

            $args = array_merge($this->defaultArgs(), $args);
            $args['labels'] = array_merge(
                $this->defaultLabels($labels['name'], $labels['singular_name']),
                $labels
            );

            // Update TermModel args
            $this->getModel()->setArgs($args);
            $this->getModel()->setLabels($labels);
        }

        // Register term
        $this->register();
    }