public void appendTag(Tag tag) {
        // item
        final Element item = createTagLIElement(new EventListener() {

            @Override
            public void onBrowserEvent(Event event) {

                if (event.getTypeInt() == Event.ONKEYDOWN && (event.getKeyCode() == KeyCodes.KEY_BACKSPACE || event.getKeyCode() == KeyCodes.KEY_DELETE)) {
                    removeTag(event.getEventTarget().<com.google.gwt.dom.client.Element>cast());
                } else if (event.getTypeInt() == Event.ONKEYDOWN && event.getKeyCode() == KeyCodes.KEY_LEFT) {
                    shiftFocusLeft(event.getEventTarget().<com.google.gwt.dom.client.Element>cast());
                } else if (event.getTypeInt() == Event.ONKEYDOWN && event.getKeyCode() == KeyCodes.KEY_RIGHT) {
                    shiftFocusRight(event.getEventTarget().<com.google.gwt.dom.client.Element>cast());
                }
            }
        }, Event.ONKEYDOWN);
        item.addClassName("input-tag-list-box");
        item.addClassName("input-tag-list-item-deletable");

        // create tag text
        SpanElement tagSpan = Document.get().createSpanElement();
        tagSpan.setInnerText(tag.getTag());
        item.appendChild(tagSpan);

        // delete tag
        Element deleteAnchor = Document.get().createAnchorElement();
        deleteAnchor.setClassName("input-tag-list-tag-delete");
        DOM.setEventListener(deleteAnchor.<com.google.gwt.user.client.Element>cast(), new EventListener() {

            @Override
            public void onBrowserEvent(Event event) {
                if (event.getTypeInt() == Event.ONCLICK) {
                    removeTag(item);
                }
            }
        });
        DOM.sinkEvents(deleteAnchor.<com.google.gwt.user.client.Element>cast(), Event.ONCLICK);
        item.appendChild(deleteAnchor);
        // insert into DOM
        tagList.insertBefore(item, inputText.getParentElement());
        // insert into inner list
        getInputTags().add(new ItemTag(tag, item));
    }