diff --git a/api/fw-server.py b/api/fw-server.py
new file mode 100644
index 000000000..34f6c7270
--- /dev/null
+++ b/api/fw-server.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+
+"""
+ fw-server.py - firmware server for Sonoff-Tasmota OTA upgrade
+
+ Copyright (C) 2018 Gennaro Tortone
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Requirements:
+ - Python3
+ - pip install netifaces flask
+
+Instructions:
+ Copy Sonoff-Tasmota firmware binary files in 'fw' directory.
+ A set of prebuilt files can be downloaded by Sonoff-Tasmota release page:
+ https://github.com/arendst/Sonoff-Tasmota/releases
+
+ Configure your Sonoff-Tasmota device with your fw-server URL:
+ Firmware Upgrade -> Upgrade by web server
+ http://:5000/sonoff-minimal.bin
+
+Usage:
+ ./fw-server.py -d (default: eth0)
+
+Example:
+ ./fw-server.py -d wlan0
+"""
+
+import io
+import os.path
+from sys import exit
+from flask import Flask, send_file
+from optparse import OptionParser
+import netifaces as ni
+
+parser = OptionParser()
+parser.add_option("-d", "--dev", action="store", type="string",
+ dest="netdev", default="eth0", help="network interface (default: eth0)")
+(options, args) = parser.parse_args()
+
+try:
+ netip = ni.ifaddresses(options.netdev)[ni.AF_INET][0]['addr']
+except Exception as e:
+ print("E: network interface error - {}".format(e))
+ exit(1)
+
+app = Flask(__name__)
+
+@app.route('/')
+def fw(filename):
+ if(os.path.exists("fw/" + str(filename))):
+ return send_file("fw/" + str(filename), attachment_filename=filename, mimetype='application/octet-stream')
+ else:
+ return("ERROR: file not found")
+
+if __name__ == "__main__":
+ try:
+ app.run(host=netip)
+ except Exception as e:
+ print("E: {}".format(e))
\ No newline at end of file
diff --git a/api/fw/README b/api/fw/README
new file mode 100644
index 000000000..c29367442
--- /dev/null
+++ b/api/fw/README
@@ -0,0 +1,3 @@
+Copy Sonoff-Tasmota firmware binary files in this directory.
+A set of prebuilt files can be downloaded by Sonoff-Tasmota release page:
+https://github.com/arendst/Sonoff-Tasmota/releases
\ No newline at end of file