diff --git a/src/cheogram/AndroidManifest.xml b/src/cheogram/AndroidManifest.xml
index d11d808a698d4a67e5156a8e3fec8696052a3ce7..57d2ec18d12baa41870e12d6e55d6eee408b750c 100644
--- a/src/cheogram/AndroidManifest.xml
+++ b/src/cheogram/AndroidManifest.xml
@@ -45,6 +45,11 @@
             android:label="@string/invite_to_app"
             android:exported="false"
             android:launchMode="singleTask" />
+        
         = Build.VERSION_CODES.Q) {
+                webView.setForceDarkAllowed(true);
+            }
+            webView.getSettings().setJavaScriptEnabled(true);
+            webView.getSettings().setDomStorageEnabled(true);
+            webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
+            webView.setWebViewClient(new WebViewClient() {
+                @Override
+                public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                    view.loadUrl(url);
+                    return true;
+                }
+            });
+            webView.setDownloadListener(new DownloadListener() {
+                @Override
+                public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
+                    final var intent = new Intent();
+                    intent.setData(Uri.parse(url));
+                    setResult(Activity.RESULT_OK, intent);
+                    finish();
+                }
+            });
+        } else {
+            Toast.makeText(this, R.string.account_status_no_internet, Toast.LENGTH_LONG).show();
+        }
+    }
+
+    @Override
+    protected void refreshUiReal() {
+
+    }
+
+    @Override
+    protected void onBackendConnected() {
+    }
+
+    //check for internet connection
+    private boolean isNetworkAvailable(Context context) {
+        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        if (connectivity != null) {
+            NetworkInfo[] info = connectivity.getAllNetworkInfo();
+            if (info != null) {
+                for (NetworkInfo anInfo : info) {
+                    if (anInfo.getState() == NetworkInfo.State.CONNECTED) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/cheogram/res/layout/activity_webxdc_store.xml b/src/cheogram/res/layout/activity_webxdc_store.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fcec66f05dbb709140cbe96625043e0bf66d697f
--- /dev/null
+++ b/src/cheogram/res/layout/activity_webxdc_store.xml
@@ -0,0 +1,55 @@
+
+
+
+    
+
+        
+
+            
+
+        
+
+        
+
+    
+
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index 5c303276b4c3c1ffafacdd713b8d48776784f745..5eb37efe0fab2577a2dc6ee042bdfb730a3eae38 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -89,6 +89,7 @@ import androidx.viewpager.widget.ViewPager;
 import com.cheogram.android.BobTransfer;
 import com.cheogram.android.EmojiSearch;
 import com.cheogram.android.WebxdcPage;
+import com.cheogram.android.WebxdcStore;
 
 import com.google.android.material.color.MaterialColors;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -217,6 +218,7 @@ public class ConversationFragment extends XmppFragment
     public static final int REQUEST_START_AUDIO_CALL = 0x213;
     public static final int REQUEST_START_VIDEO_CALL = 0x214;
     public static final int REQUEST_SAVE_STICKER = 0x215;
+    public static final int REQUEST_WEBXDC_STORE = 0x216;
     public static final int ATTACHMENT_CHOICE_CHOOSE_IMAGE = 0x0301;
     public static final int ATTACHMENT_CHOICE_TAKE_PHOTO = 0x0302;
     public static final int ATTACHMENT_CHOICE_CHOOSE_FILE = 0x0303;
@@ -1138,6 +1140,10 @@ public class ConversationFragment extends XmppFragment
 
     private void handlePositiveActivityResult(int requestCode, final Intent data) {
         switch (requestCode) {
+            case REQUEST_WEBXDC_STORE:
+                mediaPreviewAdapter.addMediaPreviews(Attachment.of(activity, data.getData(), Attachment.Type.FILE));
+                toggleInputMethod();
+                break;
             case REQUEST_SAVE_STICKER:
                 final DocumentFile df = DocumentFile.fromSingleUri(activity, data.getData());
                 final File f = savingAsSticker;
@@ -1982,6 +1988,10 @@ public class ConversationFragment extends XmppFragment
             case R.id.attach_location:
                 handleAttachmentSelection(item);
                 break;
+            case R.id.attach_webxdc:
+                final Intent intent = new Intent(getActivity(), WebxdcStore.class);
+                startActivityForResult(intent, REQUEST_WEBXDC_STORE);
+                break;
             case R.id.attach_subject:
                 binding.textinputSubject.setVisibility(binding.textinputSubject.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
                 break;
diff --git a/src/main/res/drawable/ic_help_center_24dp.xml b/src/main/res/drawable/ic_help_center_24dp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cb0ab0fd7ee717224f4ed6631ab7dda29380b4d7
--- /dev/null
+++ b/src/main/res/drawable/ic_help_center_24dp.xml
@@ -0,0 +1,5 @@
+
+      
+    
+    
+
diff --git a/src/main/res/menu/fragment_conversation.xml b/src/main/res/menu/fragment_conversation.xml
index b99997bafd22bbbd7702bf4bb9c4a601b337aa1d..1c7915bbc1a43f82fc6b898db5554d46423bcf22 100644
--- a/src/main/res/menu/fragment_conversation.xml
+++ b/src/main/res/menu/fragment_conversation.xml
@@ -62,6 +62,11 @@
                 android:icon="@drawable/ic_location_pin_24dp"
                 android:title="@string/send_location" />
 
+             
+