diff --git a/src/cheogram/java/com/cheogram/android/GridView.java b/src/cheogram/java/com/cheogram/android/GridView.java
new file mode 100644
index 0000000000000000000000000000000000000000..4301c958a66eee88bbc90032b76c61d0d3324278
--- /dev/null
+++ b/src/cheogram/java/com/cheogram/android/GridView.java
@@ -0,0 +1,38 @@
+package com.cheogram.android;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+// https://blog.jayway.com/2012/10/04/how-to-make-the-height-of-a-gridview-wrap-its-content/
+public class GridView extends android.widget.GridView {
+ public GridView(Context context) {
+ super(context);
+ }
+
+ public GridView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public GridView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int heightSpec;
+
+ if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
+ // The great Android "hackatlon", the love, the magic.
+ // The two leftmost bits in the height measure spec have
+ // a special meaning, hence we can't use them to describe height.
+ heightSpec = MeasureSpec.makeMeasureSpec(
+ Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
+ }
+ else {
+ // Any other height should be respected as is.
+ heightSpec = heightMeasureSpec;
+ }
+
+ super.onMeasure(widthMeasureSpec, heightSpec);
+ }
+}
diff --git a/src/cheogram/java/eu/siacs/conversations/xmpp/Option.java b/src/cheogram/java/eu/siacs/conversations/xmpp/Option.java
new file mode 100644
index 0000000000000000000000000000000000000000..f882c0c7a3717b1026b01bde7ed6bbfc4b83a90e
--- /dev/null
+++ b/src/cheogram/java/eu/siacs/conversations/xmpp/Option.java
@@ -0,0 +1,41 @@
+package eu.siacs.conversations.xmpp;
+
+import java.util.ArrayList;
+import java.util.List;
+import eu.siacs.conversations.xml.Element;
+
+public class Option {
+ protected final String value;
+ protected final String label;
+
+ public static List