--- a/app/src/main/java/com/codesys/forge/MainActivity.java
+++ b/app/src/main/java/com/codesys/forge/MainActivity.java
@@ -1,13 +1,12 @@
 package com.codesys.forge;
 
-import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
+import android.content.ActivityNotFoundException;
 import android.content.ClipData;
 import android.content.ClipboardManager;
 import android.content.Intent;
+import android.content.res.Configuration;
 import androidx.annotation.NonNull;
 import android.content.Context;
 import androidx.appcompat.app.AppCompatActivity;
@@ -15,7 +14,6 @@
 import androidx.core.app.NotificationManagerCompat;
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
-import android.app.ProgressDialog;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.net.Uri;
@@ -28,7 +26,9 @@
 import android.view.View;
 import android.view.ViewTreeObserver;
 import android.view.Window;
+import android.webkit.DownloadListener;
 import android.webkit.MimeTypeMap;
+import android.webkit.ValueCallback;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
 import android.webkit.WebHistoryItem;
@@ -47,13 +47,10 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStreamWriter;
 import java.math.BigInteger;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.HttpURLConnection;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Date;
@@ -63,13 +60,9 @@
 import android.net.NetworkInfo;
 import android.widget.Toast;
 
-import org.json.*;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 
-class NotificationReceiver {
-
-}
 
 public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
     private Context myContext;
@@ -89,6 +82,11 @@
     private static Boolean xTalk = Boolean.FALSE;
     private static Boolean xCacheLoggedIn = Boolean.FALSE;
 
+    private ValueCallback<Uri> mUploadMessage;
+    public ValueCallback<Uri[]> uploadMessage;
+    public static final int REQUEST_SELECT_FILE = 100;
+    private final static int FILECHOOSER_RESULTCODE = 1;
+
     // cache directory
     private File getLocalCacheDir() {
         File cacheDir = new File(MainActivity.this.getCacheDir(), "cache");
@@ -300,6 +298,32 @@
     }
 
     @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent intent)
+    {
+        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
+        {
+            if (requestCode == REQUEST_SELECT_FILE)
+            {
+                if (uploadMessage == null)
+                    return;
+                uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
+                uploadMessage = null;
+            }
+        }
+        else if (requestCode == FILECHOOSER_RESULTCODE)
+        {
+            if (null == mUploadMessage)
+                return;
+            Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
+            mUploadMessage.onReceiveValue(result);
+            mUploadMessage = null;
+        }
+        else
+            Toast.makeText(myContext, "Failed to Upload Image", Toast.LENGTH_LONG).show();
+    }
+
+
+    @Override
     protected void onCreate(Bundle savedInstanceState) {
         String myUseragent;
         String url = this.getIntent().getStringExtra("url");
@@ -337,6 +361,7 @@
         myWebView.getSettings().setAppCachePath(getCacheDir().getAbsolutePath());
         myWebView.getSettings().setDomStorageEnabled(true);
         myWebView.getSettings().setAllowFileAccess(true);
+        myWebView.getSettings().setAllowContentAccess(true);
         if(getNetworkState()) {
             setOnline();
         }
@@ -477,6 +502,52 @@
                  */
                 refreshLayout.setRefreshing(false);
                 setOffline();
+            }
+        });
+
+        // File upload
+        myWebView.setWebChromeClient(new WebChromeClient()
+        {
+            public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
+            {
+                if (uploadMessage != null) {
+                    uploadMessage.onReceiveValue(null);
+                    uploadMessage = null;
+                }
+
+                uploadMessage = filePathCallback;
+
+                Intent intent = fileChooserParams.createIntent();
+                try
+                {
+                    startActivityForResult(intent, REQUEST_SELECT_FILE);
+                } catch (ActivityNotFoundException e)
+                {
+                    uploadMessage = null;
+                    Toast.makeText(myContext, "Cannot open local files", Toast.LENGTH_LONG).show();
+                    return false;
+                }
+                return true;
+            }
+
+            protected void openFileChooser(ValueCallback<Uri> uploadMsg)
+            {
+                mUploadMessage = uploadMsg;
+                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
+                i.addCategory(Intent.CATEGORY_OPENABLE);
+                i.setType("image/*");
+                startActivityForResult(Intent.createChooser(i, "Choose a file"), FILECHOOSER_RESULTCODE);
+            }
+        });
+
+        // File download (opens with other app - no direct download)
+        myWebView.setDownloadListener(new DownloadListener() {
+            public void onDownloadStart(String url, String userAgent,
+                                        String contentDisposition, String mimetype,
+                                        long contentLength) {
+                Intent i = new Intent(Intent.ACTION_VIEW);
+                i.setData(Uri.parse(url));
+                startActivity(i);
             }
         });
 
@@ -533,6 +604,12 @@
         return super.onKeyDown(keyCode, event);
     }
 
+    // avoid reload of page on screen rotation
+    @Override
+    public void onConfigurationChanged(Configuration newConfig){
+        super.onConfigurationChanged(newConfig);
+    }
+
     @Override
     public void onStart() {
         super.onStart();