diff --git a/utils_doc/rna_manual_reference_updater.py b/utils_doc/rna_manual_reference_updater.py
index 5d2ad1de2ce5ba6257aec61ec0080cf934a154ac..7384ff8ae45d49c89ca47efcfc22aad72d065810 100644
--- a/utils_doc/rna_manual_reference_updater.py
+++ b/utils_doc/rna_manual_reference_updater.py
@@ -15,89 +15,147 @@
 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 #
 # ##### END GPL LICENSE BLOCK #####
-#
-# ##### RNA MANUAL REFERENCES #####
-#
-# This file generates a file that maps RNA strings to online URL's
-# for the context menu documentation access
-#
-# To make international, we made a script,
-# pointing the manuals to the proper language,
-# specified in the 'User Preferences Window' by the users.
-# Some Languages have their manual page, using a prefix or
-# being preceded by their respective reference, for example:
-#
-# manual/ --> manual/ru/
-#
-# The table in the script, contains all of the languages we have in the
-# Blender manual website, for those other languages that still
-# does not have a team of translators,
-# and/or don't have a manual for their languages we commented the lines below,
-# you should add them to the language table when they have a proper manual,
-# or added to the Blender UI  translation table.
-#
-# URL is the: url_manual_prefix + url_manual_mapping[#id]
+
+'''
+RNA Manual Reference Mapping Updater
+
+This script generates a file that maps RNA strings to online URL's
+for the context menu documentation access.
+
+This script either downloads a sphinx requirement file from the manual
+or optionally can take a path to the file using `--input`.
+
+To make international, we made a script,
+pointing the manuals to the proper language,
+specified in the 'User Preferences Window' by the users.
+Some Languages have their manual page, using a prefix or
+being preceded by their respective reference, for example:
+
+manual/ --> manual/ru/
+
+The table in the script, contains all of the languages we have in the
+Blender manual website, for those other languages that still
+does not have a team of translators,
+and/or don't have a manual for their languages we commented the lines below,
+you should add them to the language table when they have a proper manual,
+or added to the Blender UI  translation table.
+
+URL is the: url_manual_prefix + url_manual_mapping[#id]
+'''
 
 import os
 import sphobjinv as soi
 
-# Download and decode objects.inv
-inv = soi.Inventory(url="https://docs.blender.org/manual/en/dev/objects.inv")
-
-# Write the fire
-filepath = os.path.join("rna_manual_reference.py")
-file = open(filepath, "w", encoding="utf-8")
-fw = file.write
-
-fw("# Do not edit this file.")
-fw(" This file is auto generated from rna_manual_reference_updater.py\n\n")
-fw("import bpy\n\n")
-fw("if bpy.app.version_cycle in {'rc', 'release'}:\n")
-fw("    manual_version = '%d.%d' % bpy.app.version[:2]\n")
-fw("else:\n")
-fw("    manual_version = 'dev'\n\n")
-fw("url_manual_prefix = \"https://docs.blender.org/manual/en/\" + manual_version + \"/\"\n\n")
-fw("language = bpy.context.preferences.view.language\n")
-fw("if language == 'DEFAULT':\n")
-fw("    import os\n")
-fw("    language = os.getenv('LANG', '').split('.')[0]\n\n")
-fw("LANG = {\n")
-# fw("\"ar_EG":         \"ar",\n")
-# fw("\"bg_BG":         \"bg",\n")
-# fw("\"ca_AD":         \"ca",\n")
-# fw("\"cs_CZ":         \"cz",\n")
-fw("\"de_DE\":        \"de\",\n")  # German
-# fw("\"el_GR":         \"el",\n")
-fw("\"ru_RU\":        \"ru\",\n")  # Russian
-# fw("\"sr_RS":         \"sr",\n")
-# fw("\"sv_SE":         \"sv",\n")
-# fw("\"tr_TR":         \"th",\n")
-fw("\"uk_UA\":        \"uk\",\n")  # Ukrainian
-fw("\"es\":           \"es\",\n")  # Spanish
-# fw("\"fi_FI":         \"fi",\n")
-fw("\"fr_FR\":        \"fr\",\n")  # French
-# fw("\"id_ID":         \"id",\n")
-fw("\"it_IT\":        \"it\",\n")  # Italian
-fw("\"ja_JP\":        \"ja\",\n")  # Japanese
-fw("\"ko_KR\":        \"ko\",\n")  # Korean
-# fw("\"nl_NL":         \"nl",\n")
-# fw("\"pl_PL":         \"pl",\n")
-fw("\"pt_PT\":        \"pt\",\n")  # Portuguese
-fw("\"pt_BR\":        \"pt\",\n")  # Portuguese - for until we have a pt_BR version
-fw("\"vi_VN\":        \"vi\",\n")  # Vietnamese
-fw("\"zh_CN\":        \"zh-hans\",\n")  # Simplified Chinese
-fw("\"zh_TW\":        \"zh-hant\",\n")  # Traditional Chinese
-fw("}.get(language)\n\n")
-fw("if LANG is not None:\n")
-fw("    url_manual_prefix = url_manual_prefix.replace(\"manual/en\", \"manual/\" + LANG)\n\n")
-fw("url_manual_mapping = (\n")
-
-# Logic to manipulate strings from objects.inv
-lines = [o.data_line() for o in inv.objects if o.name.startswith("bpy.types") or o.name.startswith("bpy.ops")]
-# Finding first space will return length of rna path
-lines.sort(key=lambda l: l.find(" "), reverse=True)
-for line in lines:
-    split = line.split(" ")
-    fw("\t(\"" + split[0] + "*\", \"" + split[3] + "\"),\n")
-
-fw(")\n")
+def write_mappings(inv, output):
+    print("Writing...")
+    # Write the file
+    file = open(output, "w", encoding="utf-8")
+    fw = file.write
+
+    fw("# Do not edit this file.")
+    fw(" This file is auto generated from rna_manual_reference_updater.py\n\n")
+    fw("import bpy\n\n")
+    fw("if bpy.app.version_cycle in {'rc', 'release'}:\n")
+    fw("    manual_version = '%d.%d' % bpy.app.version[:2]\n")
+    fw("else:\n")
+    fw("    manual_version = 'dev'\n\n")
+    fw("url_manual_prefix = \"https://docs.blender.org/manual/en/\" + manual_version + \"/\"\n\n")
+    fw("language = bpy.context.preferences.view.language\n")
+    fw("if language == 'DEFAULT':\n")
+    fw("    import os\n")
+    fw("    language = os.getenv('LANG', '').split('.')[0]\n\n")
+    fw("LANG = {\n")
+    # fw("\"ar_EG":         \"ar",\n")
+    # fw("\"bg_BG":         \"bg",\n")
+    # fw("\"ca_AD":         \"ca",\n")
+    # fw("\"cs_CZ":         \"cz",\n")
+    fw("\"de_DE\":        \"de\",\n")  # German
+    # fw("\"el_GR":         \"el",\n")
+    fw("\"ru_RU\":        \"ru\",\n")  # Russian
+    # fw("\"sr_RS":         \"sr",\n")
+    # fw("\"sv_SE":         \"sv",\n")
+    # fw("\"tr_TR":         \"th",\n")
+    fw("\"uk_UA\":        \"uk\",\n")  # Ukrainian
+    fw("\"es\":           \"es\",\n")  # Spanish
+    # fw("\"fi_FI":         \"fi",\n")
+    fw("\"fr_FR\":        \"fr\",\n")  # French
+    # fw("\"id_ID":         \"id",\n")
+    fw("\"it_IT\":        \"it\",\n")  # Italian
+    fw("\"ja_JP\":        \"ja\",\n")  # Japanese
+    fw("\"ko_KR\":        \"ko\",\n")  # Korean
+    # fw("\"nl_NL":         \"nl",\n")
+    # fw("\"pl_PL":         \"pl",\n")
+    fw("\"pt_PT\":        \"pt\",\n")  # Portuguese
+    fw("\"pt_BR\":        \"pt\",\n")  # Portuguese - for until we have a pt_BR version
+    fw("\"vi_VN\":        \"vi\",\n")  # Vietnamese
+    fw("\"zh_CN\":        \"zh-hans\",\n")  # Simplified Chinese
+    fw("\"zh_TW\":        \"zh-hant\",\n")  # Traditional Chinese
+    fw("}.get(language)\n\n")
+    fw("if LANG is not None:\n")
+    fw("    url_manual_prefix = url_manual_prefix.replace(\"manual/en\", \"manual/\" + LANG)\n\n")
+    fw("url_manual_mapping = (\n")
+
+    # Logic to manipulate strings from objects.inv
+    lines = [o.data_line() for o in inv.objects if o.name.startswith("bpy.types") or o.name.startswith("bpy.ops")]
+    # Finding first space will return length of rna path
+    lines.sort(key=lambda l: l.find(" "), reverse=True)
+    for line in lines:
+        split = line.split(" ")
+        fw("\t(\"" + split[0] + "*\", \"" + split[3] + "\"),\n")
+
+    fw(")\n")
+
+
+def is_valid_file(parser, arg):
+    if not os.path.isfile(arg) :
+        parser.error("The file %s does not exist!" % arg)
+    else:
+        return arg
+
+def main():
+    import argparse
+
+    parser = argparse.ArgumentParser(
+        usage=__doc__
+        )
+
+    parser.add_argument(
+        "--input",
+        dest="filename",
+        required=False,
+        help="sphinx inventory file (objects.inv)",
+        metavar="FILE",
+        type=lambda x: is_valid_file(parser, x))
+
+    parser.add_argument(
+        "--output",
+        dest="output",
+        default="../../../release/scripts/modules/rna_manual_reference.py",
+        required=False,
+        help="path to output including filename and extentsion",
+        metavar="FILE")
+
+    parser.add_argument(
+        "--url",
+        dest="url",
+        default="https://docs.blender.org/manual/en/dev/objects.inv",
+        required=False,
+        help="url to sphinx inventory file (objects.inv)",
+        metavar="FILE")
+
+    args = parser.parse_args()
+
+    if args.filename:
+        # Download and decode objects.inv
+        print("Loading from file...")
+        inv = soi.Inventory(args.filename)
+    else:
+        # Load and decode objects.inv
+        print("Downloading...")
+        inv = soi.Inventory(url=args.url)
+
+    write_mappings(inv, args.output)
+    print("Done!")
+
+if __name__ == "__main__":
+    main()