@Override
  protected void onPerformBind() {
    super.onPerformBind();

    // Performing all required Data Binding here

    if (peer.getPeerType() == PeerType.PRIVATE) {

      // Loading user
      final UserVM user = users().get(peer.getPeerId());
      if (user == null) {
        finish();
        return;
      }

      // Binding User Avatar to Toolbar
      bind(barAvatar, user.getId(), user.getAvatar(), user.getName());

      // Binding User name to Toolbar
      bind(barTitle, user.getName());

      // Binding User presence to Toolbar
      bind(barSubtitle, barSubtitleContainer, user);

      // Binding User typing to Toolbar
      bindPrivateTyping(
          barTyping, barTypingContainer, barSubtitle, messenger().getTyping(user.getId()));

      // Hide removedFromGroup panel as we are not in group
      removedFromGroup.setVisibility(View.GONE);

    } else if (peer.getPeerType() == PeerType.GROUP) {

      // Loading group
      GroupVM group = groups().get(peer.getPeerId());
      if (group == null) {
        finish();
        return;
      }

      // Binding Group avatar to Toolbar
      bind(barAvatar, group.getId(), group.getAvatar(), group.getName());

      // Binding Group title to Toolbar
      bind(barTitle, group.getName());

      // Subtitle is always visible for Groups
      barSubtitleContainer.setVisibility(View.VISIBLE);

      // Binding group members
      bind(barSubtitle, barSubtitleContainer, group);

      // Binding group typing
      bindGroupTyping(
          barTyping, barTypingContainer, barSubtitle, messenger().getGroupTyping(group.getId()));

      // Binding membership flag to removedFromGroup panel
      bind(
          messenger().getGroups().get(peer.getPeerId()).isMember(),
          new ValueChangedListener<Boolean>() {
            @Override
            public void onChanged(Boolean val, Value<Boolean> Value) {
              removedFromGroup.setVisibility(val ? View.GONE : View.VISIBLE);
            }
          });
    }
  }