Repository: andrew-hossack/dash-tools (language: python)

Issue:
Update README.md



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..c96d779
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,33 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+## [1.4] - 2022-05-22
+
+**dash-tools command is now dashtools via command line**
+
+Major changes are an overhaul to the CLI entry to use subcommands. This looks like a change from this: `dashtools --init MyApp tabs` to `dashtools init MyApp tabs`. Also added a few new commands.
+
+### Added / Changed
+
+- Invoke dashtools now by typing: `dashtools <command>` (was `dash-tools <command>` before)
+- Added subparsers to CLI to make commands look better:
+  - `dashtools init <app name> [<template>]`
+- Added `-d` or `--dir` for `init` to specify create directory, e.g. `dashtools init <appname> [<template>] --dir ~/MySandbox`
+- Added new `--update` command to directly update to "heroku" remote
+  - `dashtools heroku --update`
+- Broke out heroku deploy command
+  - `dashtools heroku --deploy`
+- Broke out templates commands to use list, and added a new command to change specified directory into a new template directory. When running this command, `--init` will copy the specified directory to current directory with the name `Template` appended. All files will be given `.template` extensions.
+  - `dashtools templates --list`
+  - `dashtools templates --init <directory to copy>`
+- Added `dashtools run` command to run the app.py file (recursive search for app.py file, if not specified in a Procfile)
+- Better heroku deployment name generation - takes three random nouns joined by dashes and appends four alphanumeric char to end (ex. mountain-surgeon-chair-h129)
+- Added logo
+- Updated help cli print message, try: `dashtools`
+
+### Templates
+
+- Added fast-dash template https://fastdash.app/
+- Added dash-iconify template https://github.com/snehilvj/dash-iconify
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b56b9c7..e708e08 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -104,26 +104,15 @@ For simple API changes, please add adequate unit tests under `/tests`
 
 ## TODO List
 
-Commands
-- add 'dash-tools --run' to run the app.py file
-- add 'dash-tools --create-template' command to turn existing directory into a template
-- add 'dash-tools --init -d' option to specify absolute create directory  
-
-Templates
-- add fast-dash template https://github.com/dkedar7/fast_dash 
-- add dash-iconify template https://github.com/snehilvj/dash-iconify 
-
-Functionality
-- open Heroku CLI and Git CLI download links in browser
-- remove dashes -- from commands, Eg. 'dash-tools init MyApp tabs' or 'dash-tools templates --list' or 'dash-tools templates --init' or 'dash-tools heroku --deploy' or 'dash-tools heroku --update' https://realpython.com/python-command-line-arguments/ 
-
-Other 
 - create MkDocs-material website https://squidfunk.github.io/mkdocs-material/creating-your-site/
-- add a way to upload templates? 
+- Add docs for fastdash
+- Add docs for iconify
+- Rename dash-tools pypi to dashtools (?)
+- Rewrite and add unittests for CLI
 
 ## Financial Contributions
 
-This project is sponsored by helpful people like you! Please feel free to reach out directly to andrew_hossack@outlook.com if you would like to support or donate to this project. Thanks!
+This project is sponsored by helpful people like you! Please feel free to reach out directly to andrew_hossack@outlook.com or [Donate](https://github.com/sponsors/andrew-hossack) if you would like to help out this project. Thanks!
 
 ## Attribution
 
diff --git a/CREDITS.md b/CREDITS.md
new file mode 100644
index 0000000..274d322
--- /dev/null
+++ b/CREDITS.md
@@ -0,0 +1,17 @@
+# Thank You For Your Help
+
+_DashTools is supported by people like you! See [Contributing](CONTRIBUTING.md) or [Sponsorship](https://github.com/sponsors/andrew-hossack) for more details on how to help out._
+
+## Our Community
+
+### Adam Schroeder, Plotly Community Manager
+
+- Provided great support in debugging, development ideas, README changes, and promotional material
+
+### Andrew Hossack, DashTools Maintainer
+
+- Project maintainer for DashTools
+
+## Additional Attribution
+
+- Icons by Noun Project, Terminal by Zomerfeld from NounProject.com
diff --git a/README.md b/README.md
index 83f40f2..647de52 100644
--- a/README.md
+++ b/README.md
@@ -1,134 +1,136 @@
 <div align="center">
-<h1>
-<b>dash-tools</b><br>
-</h1>
-<h3>
-<i>🛠️ Plotly Dash Command Line Client 🛠️</i>
-</h3>
-<h3>
-<b><i>Create and Deploy Plotly Dash apps to Heroku in less than a minute</i></b>
-</h3> 
-
 
-[![GitHub](https://img.shields.io/github/stars/andrew-hossack/dash-tools?style=flat-square)](https://github.com/andrew-hossack/dash-tools) | [![Pypi](https://img.shields.io/pypi/v/dash-tools?style=flat-square)](https://pypi.org/project/dash-tools/) | ![Downloads](https://img.shields.io/pypi/dm/dash-tools?style=flat-square) | ![Build and Test](https://img.shields.io/github/workflow/status/andrew-hossack/dash-tools/Build%20and%20Test%20on%20Push%20or%20PR?label=Build%20and%20Test) | ![Code Quality](https://img.shields.io/lgtm/grade/python/github/andrew-hossack/dash-tools?label=Code%20Quality) | ![License](https://img.shields.io/github/license/andrew-hossack/dash-tools)
+![](docs/logo.png)
 
-![](docs/intro_gif.gif)
+<h3>
+<b><i>Create, Run and Deploy Templated Plotly Dash Apps from Terminal</i></b>
+</h3>
 
+[![GitHub](https://img.shields.io/github/stars/andrew-hossack/dash-tools?style=flat-square)](https://github.com/andrew-hossack/dash-tools) | [![Pypi](https://img.shields.io/pypi/v/dash-tools?style=flat-square)](https://pypi.org/project/dash-tools/) | [![Downloads](https://pepy.tech/badge/dash-tools)](https://pepy.tech/project/dash-tools) | ![Build and Test](https://img.shields.io/github/workflow/status/andrew-hossack/dash-tools/Build%20and%20Test%20on%20Push%20or%20PR?label=Build%20and%20Test) | ![Code Quality](https://img.shields.io/lgtm/grade/python/github/andrew-hossack/dash-tools?label=Code%20Quality) | ![License](https://img.shields.io/github/license/andrew-hossack/dash-tools)
 
+<hr>
 
 </div>
 
 ## **About**
 
-[**dash-tools**](https://github.com/andrew-hossack/dash-tools) is an open-source toolchain for [Plotly Dash Framework](https://dash.plotly.com/introduction). With a user-friendly command line interface, creating Dash applications has never been quicker.
+[**dashtools**](https://github.com/andrew-hossack/dash-tools) is an open-source toolchain for [Plotly Dash](https://dash.plotly.com/introduction). With a user-friendly command line interface, creating Dash applications and deploying them to [Heroku](https://heroku.com/) has never been quicker.
 
 Includes user and developer-friendly app templates where generating a new app only takes seconds. In fact, it will take longer to install this tool than it will to use it!
 
-Want to deploy your app to the web? We've got you covered. With [Heroku](https://heroku.com/) support, deploying your project will take under a minute.
-
 ## **Installation**
 
-Ready to use **dash-tools**? Installation is easy with pip:
+Ready to use **dashtools**? Installation is easy with pip:
 
 ```bash
 pip install dash-tools
 ```
-[Find dash-tools on PyPi](https://pypi.org/project/dash-tools/) 
+
+[Find dash-tools on PyPi](https://pypi.org/project/dash-tools/)
 
 #### Requires:
 
 - **Heroku CLI** which can be downloaded [Here](https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli)
 - **Git CLI** which can be downloaded [Here](https://git-scm.com/downloads)
-- **OS** - Linux, MacOS, Windows currently supported 
+- **OS** - Linux, MacOS, Windows currently supported
 
 ## **Usage Examples**
 
-Below are common usage examples. For a more in-depth tutorial on writing apps for Plotly Dash, see the [Plotly Dash Documentation](https://dash.plotly.com/layout). For information about dash-tools commands, read the [_Commands_](#commands) section.
+### A. Create an App
 
-### **Creating A New Project**
+1. Create a Dash project in a new directory called "MyDashApp" (using your terminal or command prompt):
+   <details>
+     <summary>Note</summary>
+     "MyDashApp" can be changed to any name. However, for the purpose of this tutorial, we recommend keeping it as "MyDashApp".
+   </details>
 
-> _For a more in-depth tutorial on using dash-tools, check out the [Create and Upload Your App](/docs/Configuring-Your-App.md) document!_
+   ```bash
+   dashtools init MyDashApp
+   ```
 
-Creating a new Dash project is very simple. The following command will create a new directory called "MyDashApp":
+2. Open the default `app.py` file that comes with this project:
+   <details>
+     <summary>Windows</summary>
 
-```bash
-dash-tools --init MyDashApp
-```
+   ```bash
+    .\MyDashApp\src\app.py
+   ```
 
-Optionally, templates can be used. Check out [Templates](#templates) for more details.
+   </details>
+   <details>
+     <summary>Linux and Mac OS</summary>
 
-You can see what files are included with your new app:
+   ```bash
+    ./MyDashApp/src/app.py
+   ```
 
-```bash
-cd MyDashApp
-```
-
-You can make changes to your app in the `src/app.py` file! See [Plotly Dash Layout Docs](https://dash.plotly.com/layout) for more information, or check out the dash-tools docs on [Configuring Your Dash App](/docs/Configuring-Your-App.md).
+   </details>
 
-When you are happy with your changes, run your dash app locally with the following command. You will be able to view your app at http://127.0.0.1:8050/ in your browser:
+3. Replace the code in `app.py` with your own app code. Make sure to keep the `server = app.server` right after app instantiation:
 
-```bash
-python src/app.py
-```
+![update-app](https://user-images.githubusercontent.com/32049495/169304171-bf23b2d0-26b4-4767-b38f-cd6586ddf56e.gif)
 
-#### **Loading CSV Files**
+4. Make sure you are in your project's root directory:
 
-A common use for Dash is to display CSV data. To see an example, use the following command to create a "MyCSVApp" app with the 'csv' template:
+   ```bash
+   cd MyCSVApp
+   ```
 
-```bash
-dash-tools --init MyCSVApp csv
-```
+5. Run your app to ensure it works:
 
-See the [Templates](#templates) section for more details on using templates.
+   ```bash
+   dashtools run
+   ```
 
-### **Deploying To Heroku**
+#### Deploy App to Web with Heroku
 
-Deploying your project online to [Heroku](https://www.heroku.com/) is simple. The CLI handles both creating and deploying a new app, as well as updating an existing app.
+6. Deploy to Heroku:
 
-#### **Using dash-tools to Create An App**
+   ```bash
+   dashtools heroku --deploy
+   ```
 
-To create an app, run the following command from your project's root directory; e.g. _/MyDashApp_ from the example above. Next, follow the simple on-screen directions and deployment will be handled for you:
+![deploy-app](./deploy-app.gif)
 
-```bash
-dash-tools --deploy-heroku
-```
+### B. Create an App with Local CSV sheet
 
-Optionally, you can specify a heroku app name as an argument. If one is not provided, you will be prompted to enter one or generate one automatically.
+A common use for Dash is to display CSV data that is located inside the project folder. For this, you can use the CSV Dash-tools template to create a project with CSV data.
 
-_Note: "some-unique-heroku-app-name" in the example below is a name that you should change!_
+1. Using App template with CSV
 
-```bash
-dash-tools --deploy-heroku some-unique-heroku-app-name
-```
+   ```bash
+   dashtools init MyCSVApp csv
+   ```
 
-And that's really it! You will be prompted to log into your heroku account, a git remote 'heroku' will be created and changes will be pushed and deployed automatically.
+2. Replace the code in `app.py` with your own app's code, like shown in **example A** above. Make sure to keep code lines 13, 26, and 27.
 
-#### **Uploading Your Existing (non dash-tools) Dash App**
+   - 13: `server = app.server`
+   - 26: `PATH = pathlib.Path(__file__).parent`
+   - 27: `DATA_PATH = PATH.joinpath("data").resolve()`
 
-Uploading an existing application without using a dash-tools templated app is easy. You need to make sure of the following:
+3. Replace the default CSV file in the `data` folder with your own CSV file
 
-- Your project contains `src/app.py` application file
-- Your `src/app.py` file contains the `server = app.server` declaration for heroku
+4. Make sure you are in your project's root directory:
 
-Since the deploy command will create your Procfile, runtime.txt and requirements.txt files for you, there is no need to worry about creating them yourself.
+   ```bash
+   cd MyCSVApp
+   ```
 
-To deploy, the next steps will be the same [as above](#using-dash-tools-to-create-an-app).
+5. Run your app to ensure it works:
 
-#### **Pushing Changes to an Existing Heroku Remote**
+   ```bash
+   dashtools run
+   ```
 
-To push changes to an existing heroku app after it is deployed, you can use the same command as before. Since a 'heroku' git remote already exists, by choosing the on-screen option to "Update Existing App", all changes will be pushed and your app will be re-deployed:
+#### Deploy App to Web with Heroku
 
-```bash
-dash-tools --deploy-heroku
-```
+6. Deploy to Heroku:
 
-If you would rather add specific files, make a commit and push to the 'heroku' remote manually:
+   ```bash
+   dashtools heroku --deploy
+   ```
 
-```bash
-git add SomeFileYouModified.txt
-git commit -m "Your Commit Message"
-git push heroku
-```
+---
 
 ## **Templates**
 
@@ -136,18 +138,20 @@ Templates contain boilerplate code for Dash projects, making it much easier to s
 
 ### **Using Templates**
 
-Use the optional template argument with the `--init` command.
+Use the optional template argument with the `init` command:
+
+    dashtools init <appname> [template]
 
 The following example will create a new app "MyWonderfulApp" (you can name your app anything) using the 'tabs' template (or any other template listed below):
 
 ```bash
-dash-tools --init MyWonderfulApp tabs
+dashtools init MyWonderfulApp tabs
 ```
 
-To list out available templates, use the `--templates` or `-t` command:
+To list out available templates, use the `templates --list` command:
 
 ```bash
-dash-tools --templates
+dashtools templates --list
 ```
 
 ### **Available Templates**
@@ -156,7 +160,7 @@ _Click the dropdowns below to see screenshots!_
 
 <details><summary>Template: 'advanced'</summary>
 
-_To use this template, type: `dash-tools --init MyFuturisticApp advanced`_
+_To use this template, type: `dashtools init MyFuturisticApp advanced`_
 
 Advanced multi-page template. Includes examples of ClientsideCallbacks, multi-page routing, external stylesheets, header, footer, and 404 page.
 ![](docs/advanced_theme.png)
@@ -165,7 +169,7 @@ Advanced multi-page template. Includes examples of ClientsideCallbacks, multi-pa
 
 <details><summary>Template: 'csv'</summary>
 
-_To use this template, type: `dash-tools --init MyCSVLoaderApp csv`_
+_To use this template, type: `dashtools init MyCSVLoaderApp csv`_
 
 Example of CSV file loading. Includes the default CSV load example from Plotly.
 ![](docs/csv_template.png)
@@ -174,7 +178,7 @@ Example of CSV file loading. Includes the default CSV load example from Plotly.
 
 <details><summary>Template: 'default'</summary>
 
-_To use this template, type: `dash-tools --init MyAmazingApp default`_
+_To use this template, type: `dashtools init MyAmazingApp default`_
 
 Basic Dash template. See [Dash Docs](https://dash.plotly.com/layout)
 ![](docs/default_theme.png)
@@ -183,7 +187,7 @@ Basic Dash template. See [Dash Docs](https://dash.plotly.com/layout)
 
 <details><summary>Template: 'iris'</summary>
 
-_To use this template, type: `dash-tools --init MyFantasticApp iris`_
+_To use this template, type: `dashtools init MyFantasticApp iris`_
 
 Iris theme. See [Faculty.ai Example](https://dash-bootstrap-components.opensource.faculty.ai/examples/iris/)
 ![](docs/iris_theme.png)
@@ -192,7 +196,7 @@ Iris theme. See [Faculty.ai Example](https://dash-bootstrap-components.opensourc
 
 <details><summary>Template: 'mantine'</summary>
 
-_To use this template, type: `dash-tools --init MyGreatApp mantine`_
+_To use this template, type: `dashtools init MyGreatApp mantine`_
 
 Basic mantine template. See [Dash Mantine](https://www.dash-mantine-components.com/)
 ![](docs/mantine_theme.png)
@@ -201,7 +205,7 @@ Basic mantine template. See [Dash Mantine](https://www.dash-mantine-components.c
 
 <details><summary>Template: 'multipage'</summary>
 
-_To use this template, type: `dash-tools --init MyPristineApp multipage`_
+_To use this template, type: `dashtools init MyPristineApp multipage`_
 
 New multipage theme. See [Multipage Plugin](https://github.com/plotly/dash-labs/blob/main/docs/08-MultiPageDashApp.md)
 ![](docs/multipage_new_theme.png)
@@ -210,7 +214,7 @@ New multipage theme. See [Multipage Plugin](https://github.com/plotly/dash-labs/
 
 <details><summary>Template: 'sidebar'</summary>
 
-_To use this template, type: `dash-tools --init MySnazzyApp sidebar`_
+_To use this template, type: `dashtools init MySnazzyApp sidebar`_
 
 Sidebar theme. See [Faculty.ai Example](https://dash-bootstrap-components.opensource.faculty.ai/examples/simple-sidebar/)
 ![](docs/sidebar_theme.png)
@@ -219,7 +223,7 @@ Sidebar theme. See [Faculty.ai Example](https://dash-bootstrap-components.openso
 
 <details><summary>Template: 'tabs'</summary>
 
-_To use this template, type: `dash-tools --init MyBeautifulApp tabs`_
+_To use this template, type: `dashtools init MyBeautifulApp tabs`_
 
 Tabs theme with dynamically generated content. See [Faculty.ai Example](https://dash-bootstrap-components.opensource.faculty.ai/examples/graphs-in-tabs/)
 ![](docs/tabs_theme.png)
@@ -228,22 +232,32 @@ Tabs theme with dynamically generated content. See [Faculty.ai Example](https://
 
 ## **Commands**
 
-### **Project Commands**
+### Usage:
+
+    dashtools <command> [options]
+
+### Commands and Options:
 
-- **`--deploy-heroku` Args: OPTIONAL (`unique heroku project name`) :** Deploys the project to Heroku using the [Heroku CLI](https://devcenter.heroku.com/categories/command-line) (Must Install Seperately) and [Git](https://git-scm.com/downloads). Invoke from the project root directory.
-- **`--init, -i` Args: REQUIRED (`project name`) OPTIONAL (`template`) :** Creates a Plotly Dash app with the given name in the current working directory. Optional args specified can be used for templates.
-- **`--templates, -t` :** List available templates.
+- **`heroku`** Handle Heroku deployment. Choose option:
+  - **`--deploy`** Deploys the current project to Heroku
+  - **`--update [remote name (OPTIONAL)]`** Push changes to existing Heroku remote
+- **`init <app name> [template (OPTIONAL)]`** Create a new app
+  - **`--dir, -d`** Specify alternative create location
+- **`run`** Run app locally from the current directory
+- **`templates`** List and create templates
+  - **`--init <directory to convert>`** Creates a template from specified directory
+  - **`--list`** List available templates
 
-### **Other**
+### Other Options:
 
-- **`--help, -h`:** Display CLI helpful hints
-- **`--version`:** Display current version.
+- **`--help, -h`** Display help message
+- **`--version, -v`** Display version
 
 ## **Troubleshooting Common Issues**
 
 Running into issues? Outlined below are common errors and solutions. If you do not find an answer below, please [Submit an Issue Ticket](https://github.com/andrew-hossack/dash-tools/issues).
 
-### **Common `--init` Issues**
+### **Common `init` Issues**
 
 <details><summary>No write permission</summary>
 
@@ -253,13 +267,13 @@ _Solution:_ Please check your write permissions for the current directory. Try t
 
 </details>
 
-### **Common `--deploy-heroku` Issues**
+### **Common `heroku --deploy` Issues**
 
 <details><summary>Error when creating requirements.txt file</summary>
 
 _Problem:_ You encounter an error when generating a requirements.txt file
 
-_Solution:_ Verify that you are running the `dash-tools --deploy-heroku` command from a valid plotly dash app directory. E.g. there is a `src/app.py` file.
+_Solution:_ Verify that you are running the `dashtools heroku --deploy` command from a valid plotly dash app directory. E.g. there is a `src/app.py` file.
 
 </details>
 
diff --git a/dash_tools/cli/cli.py b/dash_tools/cli/cli.py
deleted file mode 100644
index e7ed7d6..0000000
--- a/dash_tools/cli/cli.py
+++ /dev/null
@@ -1,78 +0,0 @@
-'''
- # @ Author: Andrew Hossack
- # @ Create Time: 2022-04-01 12:47:58
-'''
-import os
-import argparse
-from dash_tools.deploy import deployHeroku
-from dash_tools.templating import buildTemplate, templateUtils
-from dash_tools.version import __version__
-
-
-def main():
-    """
-    dash-tools CLI entry point.
-    """
-
-    parser = argparse.ArgumentParser(
-        description=f'The dash-tools v{__version__} CLI for Plotly Dash. See https://github.com/andrew-hossack/dash-tools for more information.')
-
-    parser.add_argument(
-        '-v',
-        '--version',
-        action='version',
-        version=__version__)
-
-    parser.add_argument(
-        '-i',
-        '--init',
-        help='Create a new Dash app. Args: REQUIRED: <app name> OPTIONAL: <template> (Default: "default").',
-        nargs='+')
-
-    parser.add_argument(
-        '-t',
-        '--templates',
-        help='List available templates.',
-        default=False,
-        action='store_true')
-
-    parser.add_argument(
-        '--deploy-heroku',
-        help='Deploys the current project <app name> to Heroku. Run command from the root of the project. --deploy-heroku takes either 1 argument: <app name> (e.g. dash-tools --deploy-heroku my-app) or no arguments (e.g. dash-tools --deploy-heroku)',
-        nargs='?',
-        type=str,
-        const="None",
-        dest='deploy_heroku'
-    )
-
-    handle_args(parser)
-
-
-def handle_args(parser: argparse.ArgumentParser):
-    """
-    Handles the arguments passed to the CLI.
-    """
-    args = parser.parse_args()
-
-    if args.init:
-        buildTemplate.create_app(
-            base_dir=os.getcwd(),
-            app_name=args.init[0],
-            use_template=templateUtils.get_template_from_args(args))
-        print(f'dash-tools: For an in-depth guide on configuring your app, see https://dash.plotly.com/layout')
-
-    elif args.templates:
-        print('dash-tools: Templates usage example, type: dash-tools --init MyApp csv')
-        print('dash-tools: For more information on templates, see https://github.com/andrew-hossack/dash-tools#templates')
-        print('dash-tools: templates: List of available templates:')
-        templateUtils.print_templates()
-
-    elif args.deploy_heroku:
-        app_name = args.deploy_heroku
-        if args.deploy_heroku == "None":
-            app_name = None
-        deployHeroku.deploy_app_to_heroku(os.getcwd(), app_name)
-
-    else:
-        parser.print_help()
-        exit('\ndash-tools: error: too few arguments')
diff --git a/dash_tools/version.py b/dash_tools/version.py
deleted file mode 100644
index 6f4fa58..0000000
--- a/dash_tools/version.py
+++ /dev/null
@@ -1,1 +0,0 @@
-__version__ = '1.3'
diff --git a/dash_tools/__init__.py b/dashtools/__init__.py
similarity index 100%
rename from dash_tools/__init__.py
rename to dashtools/__init__.py
diff --git a/dash_tools/cli/__init__.py b/dashtools/cli/__init__.py
similarity index 100%
rename from dash_tools/cli/__init__.py
rename to dashtools/cli/__init__.py
diff --git a/dashtools/cli/cli.py b/dashtools/cli/cli.py
new file mode 100644
index 0000000..ae95f75
--- /dev/null
+++ b/dashtools/cli/cli.py
@@ -0,0 +1,192 @@
+'''
+ # @ Author: Andrew Hossack
+ # @ Create Time: 2022-04-01 12:47:58
+ # Thanks to https://mike.depalatis.net/blog/simplifying-argparse.html
+'''
+import argparse
+import os
+import sys as _sys
+from dashtools.deploy import deployHeroku
+from dashtools.runtime import runtimeUtils
+from dashtools.templating import buildApp, buildAppUtils, createTemplate
+from dashtools.version import __version__
+
+
+class MyArgumentParser(argparse.ArgumentParser):
+    """Override default help message"""
+
+    def print_help(self, file=None):
+        if file is None:
+            file = _sys.stdout
+        message = f"""The dashtools v{__version__} CLI for Plotly Dash. See https://github.com/andrew-hossack/dash-tools for more details.
+\nUsage:
+    {'dashtools <command> [options]':<29}
+\nCommands and Options:
+    {'heroku':<29}Handle Heroku deployment. Choose option:
+        {'--deploy':<25}Deploys the current project to Heroku
+        {'--update [remote name]':<25}Push changes to existing Heroku remote
+    
+    {'init <app name> [template]':<29}Create a new app
+        {'--dir, -d':<25}Specify alternative create location
+    
+    {'run':<29}Run app locally from the current directory
+    
+    {'templates':<29}List and create templates
+        {'--init <directory>':<25}Creates a template from specified directory
+        {'--list':<25}List available templates
+\nOther Options:
+    {'--help, -h':<29}Display help message
+    {'--version, -v':<29}Display version
+"""
+        file.write(message+"\n")
+
+
+parser = MyArgumentParser()
+
+parser._positionals.title = 'Positional Arguments'
+parser._optionals.title = 'Optional Arguments'
+
+subparsers = parser.add_subparsers(dest="subcommand")
+
+
+def argument(*name_or_flags, **kwargs):
+    """Convenience function to properly format arguments to pass to the
+    subcommand decorator.
+    """
+    return (list(name_or_flags), kwargs)
+
+
+def subcommand(args=[], parent=subparsers):
+    """Decorator to define a new subcommand in a sanity-preserving way.
+    The function will be stored in the ``func`` variable when the parser
+    parses arguments so that it can be called directly like so::
+        args = cli.parse_args()
+        args.func(args)
+    Usage example::
+        @subcommand([argument("-d", help="Enable debug mode", action="store_true")])
+        def subcommand(args):
+            print(args)
+    Then on the command line::
+        $ python cli.py subcommand -d
+    """
+    def decorator(func):
+        parser = parent.add_parser(func.__name__, description=func.__doc__)
+        for arg in args:
+            parser.add_argument(*arg[0], **arg[1])
+        parser.set_defaults(func=func)
+    return decorator
+
+
+parser.add_argument(
+    '-v',
+    '--version',
+    action='version',
+    version=f'dashtools {__version__}')
+
+
+@subcommand(
+    [
+        argument(
+            "init",
+            help='Create a new Dash app. Args: REQUIRED: <app name> OPTIONAL: <template> (Default: "default").',
+            metavar='<app name> [<template>]',
+            nargs='+'),
+        argument(
+            '--dir',
+            '-d',
+            help='Specify the directory to create the app in. Args: REQUIRED: <directory>',
+            default=os.getcwd(),
+            metavar='<directory>',
+            nargs='?')
+    ])
+def init(args):
+    """Initialize a new app."""
+    if args.dir is None:
+        print('dashtools: init: No directory specified. Usage Example: dashtools init MyDashApp -d ~/Desktop')
+        exit('dashtools: init: Failed')
+    buildApp.create_app(
+        target_dir=args.dir,
+        app_name=args.init[0],
+        template=buildAppUtils.get_template_from_args(args))
+    print(
+        f'dashtools: Run your app using the "cd {args.init[0]} && dashtools run" command')
+    print(f'dashtools: For an in-depth guide on configuring your app, see https://dash.plotly.com/layout')
+
+
+@ subcommand(
+    [
+        argument(
+            "--list",
+            help="List available templates",
+            default=False,
+            action="store_true"),
+        argument(
+            "--init",
+            help="Convert directory to a template. Args: REQUIRED: <directory to convert>",
+            nargs=1),
+    ])
+def templates(args):
+    if args.list:
+        print('dashtools: Templates usage example, type: dashtools init MyApp csv')
+        print('dashtools: templates: List of available templates:')
+        buildAppUtils.print_templates()
+    elif args.init:
+        createTemplate.create_template(src=args.init[0], dest=os.getcwd())
+    else:
+        print('dashtools: templates error: too few arguments')
+        print('dashtools: For more information on templates, see https://github.com/andrew-hossack/dash-tools#templates')
+        exit('dashtools: Available templates options: --list, --init')
+
+
+@subcommand(
+    [
+        argument(
+            "--deploy",
+            help="Deploys the current project to Heroku. Run command from the root of the project",
+            default=False,
+            action="store_true",
+        ),
+        argument(
+            "--update",
+            help="Updates the current project to Heroku. Run command from the root of the project. Args: OPTIONAL: <git remote>",
+            nargs="?",
+            const="heroku",
+            type=str
+        ),
+    ])
+def heroku(args):
+    if args.deploy:
+        deployHeroku.deploy_app_to_heroku(os.getcwd())
+    elif args.update:
+        deployHeroku.update_heroku_app(args.update)
+    else:
+        print('dashtools: heroku error: too few arguments')
+        exit('dashtools: Available heroku options: --deploy, --update')
+
+
+@subcommand(
+    [
+        argument(
+            "run",
+            help="Run the app locally. Uses Procfile if available, else recursive search for app.py",
+            default=False,
+            action="store_true"),
+    ])
+def run(args):
+    if args.run:
+        try:
+            runtimeUtils.run_app(os.getcwd())
+        except RuntimeError as e:
+            print(e)
+            exit('dashtools: run: Failed')
+
+
+def main():
+    """
+    dashtools CLI entry point.
+    """
+    args = parser.parse_args()
+    if args.subcommand is None:
+        parser.print_help()
+    else:
+        args.func(args)
diff --git a/dash_tools/deploy/__init__.py b/dashtools/data/__init__.py
similarity index 100%
rename from dash_tools/deploy/__init__.py
rename to dashtools/data/__init__.py
diff --git a/dashtools/data/nounlist.csv b/dashtools/data/nounlist.csv
new file mode 100644
index 0000000..3f0d1dc
--- /dev/null
+++ b/dashtools/data/nounlist.csv
@@ -0,0 +1,6801 @@
+ATM
+CD
+SUV
+TV
+aardvark
+abacus
+abbey
+abbreviation
+abdomen
+ability
+abnormality
+abolishment
+abortion
+abrogation
+absence
+abundance
+abuse
+academics
+academy
+accelerant
+accelerator
+accent
+acceptance
+access
+accessory
+accident
+accommodation
+accompanist
+accomplishment
+accord
+accordance
+accordion
+account
+accountability
+accountant
+accounting
+accuracy
+accusation
+acetate
+achievement
+achiever
+acid
+acknowledgment
+acorn
+acoustics
+acquaintance
+acquisition
+acre
+acrylic
+act
+action
+activation
+activist
+activity
+actor
+actress
+acupuncture
+ad
+adaptation
+adapter
+addiction
+addition
+address
+adjective
+adjustment
+admin
+administration
+administrator
+admire
+admission
+adobe
+adoption
+adrenalin
+adrenaline
+adult
+adulthood
+advance
+advancement
+advantage
+advent
+adverb
+advertisement
+advertising
+advice
+adviser
+advocacy
+advocate
+affair
+affect
+affidavit
+affiliate
+affinity
+afoul
+afterlife
+aftermath
+afternoon
+aftershave
+aftershock
+afterthought
+age
+agency
+agenda
+agent
+aggradation
+aggression
+aglet
+agony
+agreement
+agriculture
+aid
+aide
+aim
+air
+airbag
+airbus
+aircraft
+airfare
+airfield
+airforce
+airline
+airmail
+airman
+airplane
+airport
+airship
+airspace
+alarm
+alb
+albatross
+album
+alcohol
+alcove
+alder
+ale
+alert
+alfalfa
+algebra
+algorithm
+alias
+alibi
+alien
+allegation
+allergist
+alley
+alliance
+alligator
+allocation
+allowance
+alloy
+alluvium
+almanac
+almighty
+almond
+alpaca
+alpenglow
+alpenhorn
+alpha
+alphabet
+altar
+alteration
+alternative
+altitude
+alto
+aluminium
+aluminum
+amazement
+amazon
+ambassador
+amber
+ambience
+ambiguity
+ambition
+ambulance
+amendment
+amenity
+ammunition
+amnesty
+amount
+amusement
+anagram
+analgesia
+analog
+analogue
+analogy
+analysis
+analyst
+analytics
+anarchist
+anarchy
+anatomy
+ancestor
+anchovy
+android
+anesthesiologist
+anesthesiology
+angel
+anger
+angina
+angiosperm
+angle
+angora
+angstrom
+anguish
+animal
+anime
+anise
+ankle
+anklet
+anniversary
+announcement
+annual
+anorak
+answer
+ant
+anteater
+antecedent
+antechamber
+antelope
+antennae
+anterior
+anthropology
+antibody
+anticipation
+anticodon
+antigen
+antique
+antiquity
+antler
+antling
+anxiety
+anybody
+anyone
+anything
+anywhere
+apartment
+ape
+aperitif
+apology
+app
+apparatus
+apparel
+appeal
+appearance
+appellation
+appendix
+appetiser
+appetite
+appetizer
+applause
+apple
+applewood
+appliance
+application
+appointment
+appreciation
+apprehension
+approach
+appropriation
+approval
+apricot
+apron
+apse
+aquarium
+aquifer
+arcade
+arch
+arch-rival
+archaeologist
+archaeology
+archeology
+archer
+architect
+architecture
+archives
+area
+arena
+argument
+arithmetic
+ark
+arm
+arm-rest
+armadillo
+armament
+armchair
+armoire
+armor
+armour
+armpit
+armrest
+army
+arrangement
+array
+arrest
+arrival
+arrogance
+arrow
+art
+artery
+arthur
+artichoke
+article
+artifact
+artificer
+artist
+ascend
+ascent
+ascot
+ash
+ashram
+ashtray
+aside
+asparagus
+aspect
+asphalt
+aspic
+ass
+assassination
+assault
+assembly
+assertion
+assessment
+asset
+assignment
+assist
+assistance
+assistant
+associate
+association
+assumption
+assurance
+asterisk
+astrakhan
+astrolabe
+astrologer
+astrology
+astronomy
+asymmetry
+atelier
+atheist
+athlete
+athletics
+atmosphere
+atom
+atrium
+attachment
+attack
+attacker
+attainment
+attempt
+attendance
+attendant
+attention
+attenuation
+attic
+attitude
+attorney
+attraction
+attribute
+auction
+audience
+audit
+auditorium
+aunt
+authentication
+authenticity
+author
+authorisation
+authority
+authorization
+auto
+autoimmunity
+automation
+automaton
+autumn
+availability
+avalanche
+avenue
+average
+avocado
+award
+awareness
+awe
+axis
+azimuth
+babe
+baboon
+babushka
+baby
+bachelor
+back
+back-up
+backbone
+backburn
+backdrop
+background
+backpack
+backup
+backyard
+bacon
+bacterium
+badge
+badger
+bafflement
+bag
+bagel
+baggage
+baggie
+baggy
+bagpipe
+bail
+bait
+bake
+baker
+bakery
+bakeware
+balaclava
+balalaika
+balance
+balcony
+ball
+ballet
+balloon
+balloonist
+ballot
+ballpark
+bamboo
+ban
+banana
+band
+bandana
+bandanna
+bandolier
+bandwidth
+bangle
+banjo
+bank
+bankbook
+banker
+banking
+bankruptcy
+banner
+banquette
+banyan
+baobab
+bar
+barbecue
+barbeque
+barber
+barbiturate
+bargain
+barge
+baritone
+barium
+bark
+barley
+barn
+barometer
+barracks
+barrage
+barrel
+barrier
+barstool
+bartender
+base
+baseball
+baseboard
+baseline
+basement
+basics
+basil
+basin
+basis
+basket
+basketball
+bass
+bassinet
+bassoon
+bat
+bath
+bather
+bathhouse
+bathrobe
+bathroom
+bathtub
+battalion
+batter
+battery
+batting
+battle
+battleship
+bay
+bayou
+beach
+bead
+beak
+beam
+bean
+beancurd
+beanie
+beanstalk
+bear
+beard
+beast
+beastie
+beat
+beating
+beauty
+beaver
+beck
+bed
+bedrock
+bedroom
+bee
+beech
+beef
+beer
+beet
+beetle
+beggar
+beginner
+beginning
+begonia
+behalf
+behavior
+behaviour
+beheading
+behest
+behold
+being
+belfry
+belief
+believer
+bell
+belligerency
+bellows
+belly
+belt
+bench
+bend
+beneficiary
+benefit
+beret
+berry
+best-seller
+bestseller
+bet
+beverage
+beyond
+bias
+bibliography
+bicycle
+bid
+bidder
+bidding
+bidet
+bifocals
+bijou
+bike
+bikini
+bill
+billboard
+billing
+billion
+bin
+binoculars
+biology
+biopsy
+biosphere
+biplane
+birch
+bird
+bird-watcher
+birdbath
+birdcage
+birdhouse
+birth
+birthday
+biscuit
+bit
+bite
+bitten
+bitter
+black
+blackberry
+blackbird
+blackboard
+blackfish
+blackness
+bladder
+blade
+blame
+blank
+blanket
+blast
+blazer
+blend
+blessing
+blight
+blind
+blinker
+blister
+blizzard
+block
+blocker
+blog
+blogger
+blood
+bloodflow
+bloom
+bloomer
+blossom
+blouse
+blow
+blowgun
+blowhole
+blue
+blueberry
+blush
+boar
+board
+boat
+boatload
+boatyard
+bob
+bobcat
+body
+bog
+bolero
+bolt
+bomb
+bomber
+bombing
+bond
+bonding
+bondsman
+bone
+bonfire
+bongo
+bonnet
+bonsai
+bonus
+boogeyman
+book
+bookcase
+bookend
+booking
+booklet
+bookmark
+boolean
+boom
+boon
+boost
+booster
+boot
+bootee
+bootie
+booty
+border
+bore
+borrower
+borrowing
+bosom
+boss
+botany
+bother
+bottle
+bottling
+bottom
+bottom-line
+boudoir
+bough
+boulder
+boulevard
+boundary
+bouquet
+bourgeoisie
+bout
+boutique
+bow
+bower
+bowl
+bowler
+bowling
+bowtie
+box
+boxer
+boxspring
+boy
+boycott
+boyfriend
+boyhood
+boysenberry
+bra
+brace
+bracelet
+bracket
+brain
+brake
+bran
+branch
+brand
+brandy
+brass
+brassiere
+bratwurst
+bread
+breadcrumb
+breadfruit
+break
+breakdown
+breakfast
+breakpoint
+breakthrough
+breast
+breastplate
+breath
+breeze
+brewer
+bribery
+brick
+bricklaying
+bride
+bridge
+brief
+briefing
+briefly
+briefs
+brilliant
+brink
+brisket
+broad
+broadcast
+broccoli
+brochure
+brocolli
+broiler
+broker
+bronchitis
+bronco
+bronze
+brooch
+brood
+brook
+broom
+brother
+brother-in-law
+brow
+brown
+brownie
+browser
+browsing
+brunch
+brush
+brushfire
+brushing
+bubble
+buck
+bucket
+buckle
+buckwheat
+bud
+buddy
+budget
+buffalo
+buffer
+buffet
+bug
+buggy
+bugle
+builder
+building
+bulb
+bulk
+bull
+bull-fighter
+bulldozer
+bullet
+bump
+bumper
+bun
+bunch
+bungalow
+bunghole
+bunkhouse
+burden
+bureau
+burglar
+burial
+burlesque
+burn
+burn-out
+burning
+burrito
+burro
+burrow
+burst
+bus
+bush
+business
+businessman
+bust
+bustle
+butane
+butcher
+butler
+butter
+butterfly
+button
+buy
+buyer
+buying
+buzz
+buzzard
+c-clamp
+cabana
+cabbage
+cabin
+cabinet
+cable
+caboose
+cacao
+cactus
+caddy
+cadet
+cafe
+caffeine
+caftan
+cage
+cake
+calcification
+calculation
+calculator
+calculus
+calendar
+calf
+caliber
+calibre
+calico
+call
+calm
+calorie
+camel
+cameo
+camera
+camp
+campaign
+campaigning
+campanile
+camper
+campus
+can
+canal
+cancer
+candelabra
+candidacy
+candidate
+candle
+candy
+cane
+cannibal
+cannon
+canoe
+canon
+canopy
+cantaloupe
+canteen
+canvas
+cap
+capability
+capacity
+cape
+caper
+capital
+capitalism
+capitulation
+capon
+cappelletti
+cappuccino
+captain
+caption
+captor
+car
+carabao
+caramel
+caravan
+carbohydrate
+carbon
+carboxyl
+card
+cardboard
+cardigan
+care
+career
+cargo
+caribou
+carload
+carnation
+carnival
+carol
+carotene
+carp
+carpenter
+carpet
+carpeting
+carport
+carriage
+carrier
+carrot
+carry
+cart
+cartel
+carter
+cartilage
+cartload
+cartoon
+cartridge
+carving
+cascade
+case
+casement
+cash
+cashew
+cashier
+casino
+casket
+cassava
+casserole
+cassock
+cast
+castanet
+castle
+casualty
+cat
+catacomb
+catalogue
+catalysis
+catalyst
+catamaran
+catastrophe
+catch
+catcher
+category
+caterpillar
+cathedral
+cation
+catsup
+cattle
+cauliflower
+causal
+cause
+causeway
+caution
+cave
+caviar
+cayenne
+ceiling
+celebration
+celebrity
+celeriac
+celery
+cell
+cellar
+cello
+celsius
+cement
+cemetery
+cenotaph
+census
+cent
+center
+centimeter
+centre
+centurion
+century
+cephalopod
+ceramic
+ceramics
+cereal
+ceremony
+certainty
+certificate
+certification
+cesspool
+chafe
+chain
+chainstay
+chair
+chairlift
+chairman
+chairperson
+chaise
+chalet
+chalice
+chalk
+challenge
+chamber
+champagne
+champion
+championship
+chance
+chandelier
+change
+channel
+chaos
+chap
+chapel
+chaplain
+chapter
+character
+characteristic
+characterization
+chard
+charge
+charger
+charity
+charlatan
+charm
+charset
+chart
+charter
+chasm
+chassis
+chastity
+chasuble
+chateau
+chatter
+chauffeur
+chauvinist
+check
+checkbook
+checking
+checkout
+checkroom
+cheddar
+cheek
+cheer
+cheese
+cheesecake
+cheetah
+chef
+chem
+chemical
+chemistry
+chemotaxis
+cheque
+cherry
+chess
+chest
+chestnut
+chick
+chicken
+chicory
+chief
+chiffonier
+child
+childbirth
+childhood
+chili
+chill
+chime
+chimpanzee
+chin
+chinchilla
+chino
+chip
+chipmunk
+chit-chat
+chivalry
+chive
+chives
+chocolate
+choice
+choir
+choker
+cholesterol
+choosing
+chop
+chops
+chopstick
+chopsticks
+chord
+chorus
+chow
+chowder
+chrome
+chromolithograph
+chronicle
+chronograph
+chronometer
+chrysalis
+chub
+chuck
+chug
+church
+churn
+chutney
+cicada
+cigarette
+cilantro
+cinder
+cinema
+cinnamon
+circadian
+circle
+circuit
+circulation
+circumference
+circumstance
+cirrhosis
+cirrus
+citizen
+citizenship
+citron
+citrus
+city
+civilian
+civilisation
+civilization
+claim
+clam
+clamp
+clan
+clank
+clapboard
+clarification
+clarinet
+clarity
+clasp
+class
+classic
+classification
+classmate
+classroom
+clause
+clave
+clavicle
+clavier
+claw
+clay
+cleaner
+clearance
+clearing
+cleat
+cleavage
+clef
+cleft
+clergyman
+cleric
+clerk
+click
+client
+cliff
+climate
+climb
+clinic
+clip
+clipboard
+clipper
+cloak
+cloakroom
+clock
+clockwork
+clogs
+cloister
+clone
+close
+closet
+closing
+closure
+cloth
+clothes
+clothing
+cloud
+cloudburst
+clove
+clover
+cloves
+club
+clue
+cluster
+clutch
+co-producer
+coach
+coal
+coalition
+coast
+coaster
+coat
+cob
+cobbler
+cobweb
+cock
+cockpit
+cockroach
+cocktail
+cocoa
+coconut
+cod
+code
+codepage
+codling
+codon
+codpiece
+coevolution
+cofactor
+coffee
+coffin
+cohesion
+cohort
+coil
+coin
+coincidence
+coinsurance
+coke
+cold
+coleslaw
+coliseum
+collaboration
+collagen
+collapse
+collar
+collard
+collateral
+colleague
+collection
+collectivisation
+collectivization
+collector
+college
+collision
+colloquy
+colon
+colonial
+colonialism
+colonisation
+colonization
+colony
+color
+colorlessness
+colt
+column
+columnist
+comb
+combat
+combination
+combine
+comeback
+comedy
+comestible
+comfort
+comfortable
+comic
+comics
+comma
+command
+commander
+commandment
+comment
+commerce
+commercial
+commission
+commitment
+committee
+commodity
+common
+commonsense
+commotion
+communicant
+communication
+communion
+communist
+community
+commuter
+company
+comparison
+compass
+compassion
+compassionate
+compensation
+competence
+competition
+competitor
+complaint
+complement
+completion
+complex
+complexity
+compliance
+complication
+complicity
+compliment
+component
+comportment
+composer
+composite
+composition
+compost
+comprehension
+compress
+compromise
+comptroller
+compulsion
+computer
+comradeship
+con
+concentrate
+concentration
+concept
+conception
+concern
+concert
+conclusion
+concrete
+condition
+conditioner
+condominium
+condor
+conduct
+conductor
+cone
+confectionery
+conference
+confidence
+confidentiality
+configuration
+confirmation
+conflict
+conformation
+confusion
+conga
+congo
+congregation
+congress
+congressman
+congressperson
+conifer
+connection
+connotation
+conscience
+consciousness
+consensus
+consent
+consequence
+conservation
+conservative
+consideration
+consignment
+consist
+consistency
+console
+consonant
+conspiracy
+conspirator
+constant
+constellation
+constitution
+constraint
+construction
+consul
+consulate
+consulting
+consumer
+consumption
+contact
+contact lens
+contagion
+container
+content
+contention
+contest
+context
+continent
+contingency
+continuity
+contour
+contract
+contractor
+contrail
+contrary
+contrast
+contribution
+contributor
+control
+controller
+controversy
+convection
+convenience
+convention
+conversation
+conversion
+convert
+convertible
+conviction
+cook
+cookbook
+cookie
+cooking
+coonskin
+cooperation
+coordination
+coordinator
+cop
+cop-out
+cope
+copper
+copy
+copying
+copyright
+copywriter
+coral
+cord
+corduroy
+core
+cork
+cormorant
+corn
+corner
+cornerstone
+cornet
+cornflakes
+cornmeal
+corporal
+corporation
+corporatism
+corps
+corral
+correspondence
+correspondent
+corridor
+corruption
+corsage
+cosset
+cost
+costume
+cot
+cottage
+cotton
+couch
+cougar
+cough
+council
+councilman
+councilor
+councilperson
+counsel
+counseling
+counselling
+counsellor
+counselor
+count
+counter
+counter-force
+counterpart
+counterterrorism
+countess
+country
+countryside
+county
+couple
+coupon
+courage
+course
+court
+courthouse
+courtroom
+cousin
+covariate
+cover
+coverage
+coverall
+cow
+cowbell
+cowboy
+coyote
+crab
+crack
+cracker
+crackers
+cradle
+craft
+craftsman
+cranberry
+crane
+cranky
+crap
+crash
+crate
+cravat
+craw
+crawdad
+crayfish
+crayon
+crazy
+cream
+creation
+creationism
+creationist
+creative
+creativity
+creator
+creature
+creche
+credential
+credenza
+credibility
+credit
+creditor
+creek
+creme brulee
+crepe
+crest
+crew
+crewman
+crewmate
+crewmember
+crewmen
+cria
+crib
+cribbage
+cricket
+cricketer
+crime
+criminal
+crinoline
+crisis
+crisp
+criteria
+criterion
+critic
+criticism
+crocodile
+crocus
+croissant
+crook
+crop
+cross
+cross-contamination
+cross-stitch
+crotch
+croup
+crow
+crowd
+crown
+crucifixion
+crude
+cruelty
+cruise
+crumb
+crunch
+crusader
+crush
+crust
+cry
+crystal
+crystallography
+cub
+cube
+cuckoo
+cucumber
+cue
+cuff-link
+cuisine
+cultivar
+cultivator
+culture
+culvert
+cummerbund
+cup
+cupboard
+cupcake
+cupola
+curd
+cure
+curio
+curiosity
+curl
+curler
+currant
+currency
+current
+curriculum
+curry
+curse
+cursor
+curtailment
+curtain
+curve
+cushion
+custard
+custody
+custom
+customer
+cut
+cuticle
+cutlet
+cutover
+cutting
+cyclamen
+cycle
+cyclone
+cyclooxygenase
+cygnet
+cylinder
+cymbal
+cynic
+cyst
+cytokine
+cytoplasm
+dad
+daddy
+daffodil
+dagger
+dahlia
+daikon
+daily
+dairy
+daisy
+dam
+damage
+dame
+damn
+dance
+dancer
+dancing
+dandelion
+danger
+dare
+dark
+darkness
+darn
+dart
+dash
+dashboard
+data
+database
+date
+daughter
+dawn
+day
+daybed
+daylight
+dead
+deadline
+deal
+dealer
+dealing
+dearest
+death
+deathwatch
+debate
+debris
+debt
+debtor
+decade
+decadence
+decency
+decimal
+decision
+decision-making
+deck
+declaration
+declination
+decline
+decoder
+decongestant
+decoration
+decrease
+decryption
+dedication
+deduce
+deduction
+deed
+deep
+deer
+default
+defeat
+defendant
+defender
+defense
+deficit
+definition
+deformation
+degradation
+degree
+delay
+deliberation
+delight
+delivery
+demand
+democracy
+democrat
+demon
+demur
+den
+denim
+denominator
+density
+dentist
+deodorant
+department
+departure
+dependency
+dependent
+deployment
+deposit
+deposition
+depot
+depression
+depressive
+depth
+deputy
+derby
+derivation
+derivative
+derrick
+descendant
+descent
+description
+desert
+design
+designation
+designer
+desire
+desk
+desktop
+dessert
+destination
+destiny
+destroyer
+destruction
+detail
+detainee
+detainment
+detection
+detective
+detector
+detention
+determination
+detour
+devastation
+developer
+developing
+development
+developmental
+deviance
+deviation
+device
+devil
+dew
+dhow
+diabetes
+diadem
+diagnosis
+diagram
+dial
+dialect
+dialogue
+diam
+diamond
+diaper
+diaphragm
+diarist
+diary
+dibble
+dick
+dickey
+dictaphone
+dictator
+diction
+dictionary
+die
+diesel
+diet
+difference
+differential
+difficulty
+diffuse
+dig
+digestion
+digestive
+digger
+digging
+digit
+dignity
+dilapidation
+dill
+dilution
+dime
+dimension
+dimple
+diner
+dinghy
+dining
+dinner
+dinosaur
+dioxide
+dip
+diploma
+diplomacy
+dipstick
+direction
+directive
+director
+directory
+dirndl
+dirt
+disability
+disadvantage
+disagreement
+disappointment
+disarmament
+disaster
+discharge
+discipline
+disclaimer
+disclosure
+disco
+disconnection
+discount
+discourse
+discovery
+discrepancy
+discretion
+discrimination
+discussion
+disdain
+disease
+disembodiment
+disengagement
+disguise
+disgust
+dish
+dishwasher
+disk
+disparity
+dispatch
+displacement
+display
+disposal
+disposer
+disposition
+dispute
+disregard
+disruption
+dissemination
+dissonance
+distance
+distinction
+distortion
+distribution
+distributor
+district
+divalent
+divan
+diver
+diversity
+divide
+dividend
+divider
+divine
+diving
+division
+divorce
+doc
+dock
+doctor
+doctorate
+doctrine
+document
+documentary
+documentation
+doe
+dog
+doggie
+dogsled
+dogwood
+doing
+doll
+dollar
+dollop
+dolman
+dolor
+dolphin
+domain
+dome
+domination
+donation
+donkey
+donor
+donut
+door
+doorbell
+doorknob
+doorpost
+doorway
+dory
+dose
+dot
+double
+doubling
+doubt
+doubter
+dough
+doughnut
+down
+downfall
+downforce
+downgrade
+download
+downstairs
+downtown
+downturn
+dozen
+draft
+drag
+dragon
+dragonfly
+dragonfruit
+dragster
+drain
+drainage
+drake
+drama
+dramaturge
+drapes
+draw
+drawbridge
+drawer
+drawing
+dream
+dreamer
+dredger
+dress
+dresser
+dressing
+drill
+drink
+drinking
+drive
+driver
+driveway
+driving
+drizzle
+dromedary
+drop
+drudgery
+drug
+drum
+drummer
+drunk
+dryer
+duck
+duckling
+dud
+dude
+due
+duel
+dueling
+duffel
+dugout
+dulcimer
+dumbwaiter
+dump
+dump truck
+dune
+dune buggy
+dungarees
+dungeon
+duplexer
+duration
+durian
+dusk
+dust
+dust storm
+duster
+duty
+dwarf
+dwell
+dwelling
+dynamics
+dynamite
+dynamo
+dynasty
+dysfunction
+e-book
+e-mail
+e-reader
+eagle
+eaglet
+ear
+eardrum
+earmuffs
+earnings
+earplug
+earring
+earrings
+earth
+earthquake
+earthworm
+ease
+easel
+east
+eating
+eaves
+eavesdropper
+ecclesia
+echidna
+eclipse
+ecliptic
+ecology
+economics
+economy
+ecosystem
+ectoderm
+ectodermal
+ecumenist
+eddy
+edge
+edger
+edible
+editing
+edition
+editor
+editorial
+education
+eel
+effacement
+effect
+effective
+effectiveness
+effector
+efficacy
+efficiency
+effort
+egg
+egghead
+eggnog
+eggplant
+ego
+eicosanoid
+ejector
+elbow
+elderberry
+election
+electricity
+electrocardiogram
+electronics
+element
+elephant
+elevation
+elevator
+eleventh
+elf
+elicit
+eligibility
+elimination
+elite
+elixir
+elk
+ellipse
+elm
+elongation
+elver
+email
+emanate
+embarrassment
+embassy
+embellishment
+embossing
+embryo
+emerald
+emergence
+emergency
+emergent
+emery
+emission
+emitter
+emotion
+emphasis
+empire
+employ
+employee
+employer
+employment
+empowerment
+emu
+enactment
+encirclement
+enclave
+enclosure
+encounter
+encouragement
+encyclopedia
+end
+endive
+endoderm
+endorsement
+endothelium
+endpoint
+enemy
+energy
+enforcement
+engagement
+engine
+engineer
+engineering
+enigma
+enjoyment
+enquiry
+enrollment
+enterprise
+entertainment
+enthusiasm
+entirety
+entity
+entrance
+entree
+entrepreneur
+entry
+envelope
+environment
+envy
+enzyme
+epauliere
+epee
+ephemera
+ephemeris
+ephyra
+epic
+episode
+epithelium
+epoch
+eponym
+epoxy
+equal
+equality
+equation
+equinox
+equipment
+equity
+equivalent
+era
+eraser
+erection
+erosion
+error
+escalator
+escape
+escort
+espadrille
+espalier
+essay
+essence
+essential
+establishment
+estate
+estimate
+estrogen
+estuary
+eternity
+ethernet
+ethics
+ethnicity
+ethyl
+euphonium
+eurocentrism
+evaluation
+evaluator
+evaporation
+eve
+evening
+evening-wear
+event
+everybody
+everyone
+everything
+eviction
+evidence
+evil
+evocation
+evolution
+ex-husband
+ex-wife
+exaggeration
+exam
+examination
+examiner
+example
+exasperation
+excellence
+exception
+excerpt
+excess
+exchange
+excitement
+exclamation
+excursion
+excuse
+execution
+executive
+executor
+exercise
+exhaust
+exhaustion
+exhibit
+exhibition
+exile
+existence
+exit
+exocrine
+expansion
+expansionism
+expectancy
+expectation
+expedition
+expense
+experience
+experiment
+experimentation
+expert
+expertise
+explanation
+exploration
+explorer
+explosion
+export
+expose
+exposition
+exposure
+expression
+extension
+extent
+exterior
+external
+extinction
+extreme
+extremist
+eye
+eyeball
+eyebrow
+eyebrows
+eyeglasses
+eyelash
+eyelashes
+eyelid
+eyelids
+eyeliner
+eyestrain
+eyrie
+fabric
+face
+facelift
+facet
+facility
+facsimile
+fact
+factor
+factory
+faculty
+fahrenheit
+fail
+failure
+fairness
+fairy
+faith
+faithful
+fall
+fallacy
+falling-out
+fame
+familiar
+familiarity
+family
+fan
+fang
+fanlight
+fanny
+fanny-pack
+fantasy
+farm
+farmer
+farming
+farmland
+farrow
+fascia
+fashion
+fat
+fate
+father
+father-in-law
+fatigue
+fatigues
+faucet
+fault
+fav
+fava
+favor
+favorite
+fawn
+fax
+fear
+feast
+feather
+feature
+fedelini
+federation
+fedora
+fee
+feed
+feedback
+feeding
+feel
+feeling
+fellow
+felony
+female
+fen
+fence
+fencing
+fender
+feng
+fennel
+ferret
+ferry
+ferryboat
+fertilizer
+festival
+fetus
+few
+fiber
+fiberglass
+fibre
+fibroblast
+fibrosis
+ficlet
+fiction
+fiddle
+field
+fiery
+fiesta
+fifth
+fig
+fight
+fighter
+figure
+figurine
+file
+filing
+fill
+fillet
+filly
+film
+filter
+filth
+final
+finance
+financing
+finding
+fine
+finer
+finger
+fingerling
+fingernail
+finish
+finisher
+fir
+fire
+fireman
+fireplace
+firewall
+firm
+first
+fish
+fishbone
+fisherman
+fishery
+fishing
+fishmonger
+fishnet
+fisting
+fit
+fitness
+fix
+fixture
+flag
+flair
+flame
+flan
+flanker
+flare
+flash
+flat
+flatboat
+flavor
+flax
+fleck
+fledgling
+fleece
+flesh
+flexibility
+flick
+flicker
+flight
+flint
+flintlock
+flip-flops
+flock
+flood
+floodplain
+floor
+floozie
+flour
+flow
+flower
+flu
+flugelhorn
+fluke
+flume
+flung
+flute
+fly
+flytrap
+foal
+foam
+fob
+focus
+fog
+fold
+folder
+folk
+folklore
+follower
+following
+fondue
+font
+food
+foodstuffs
+fool
+foot
+footage
+football
+footnote
+footprint
+footrest
+footstep
+footstool
+footwear
+forage
+forager
+foray
+force
+ford
+forearm
+forebear
+forecast
+forehead
+foreigner
+forelimb
+forest
+forestry
+forever
+forgery
+fork
+form
+formal
+formamide
+format
+formation
+former
+formicarium
+formula
+fort
+forte
+fortnight
+fortress
+fortune
+forum
+foundation
+founder
+founding
+fountain
+fourths
+fowl
+fox
+foxglove
+fraction
+fragrance
+frame
+framework
+fratricide
+fraud
+fraudster
+freak
+freckle
+freedom
+freelance
+freezer
+freezing
+freight
+freighter
+frenzy
+freon
+frequency
+fresco
+friction
+fridge
+friend
+friendship
+fries
+frigate
+fright
+fringe
+fritter
+frock
+frog
+front
+frontier
+frost
+frosting
+frown
+fruit
+frustration
+fry
+fuck
+fuel
+fugato
+fulfillment
+full
+fun
+function
+functionality
+fund
+funding
+fundraising
+funeral
+fur
+furnace
+furniture
+furry
+fusarium
+futon
+future
+gadget
+gaffe
+gaffer
+gain
+gaiters
+gale
+gall-bladder
+gallery
+galley
+gallon
+galoshes
+gambling
+game
+gamebird
+gaming
+gamma-ray
+gander
+gang
+gap
+garage
+garb
+garbage
+garden
+garlic
+garment
+garter
+gas
+gasket
+gasoline
+gasp
+gastronomy
+gastropod
+gate
+gateway
+gather
+gathering
+gator
+gauge
+gauntlet
+gavel
+gazebo
+gazelle
+gear
+gearshift
+geek
+gel
+gelatin
+gelding
+gem
+gemsbok
+gender
+gene
+general
+generation
+generator
+generosity
+genetics
+genie
+genius
+genocide
+genre
+gentleman
+geography
+geology
+geometry
+geranium
+gerbil
+gesture
+geyser
+gherkin
+ghost
+giant
+gift
+gig
+gigantism
+giggle
+ginger
+gingerbread
+ginseng
+giraffe
+girdle
+girl
+girlfriend
+git
+glacier
+gladiolus
+glance
+gland
+glass
+glasses
+glee
+glen
+glider
+gliding
+glimpse
+globe
+glockenspiel
+gloom
+glory
+glove
+glow
+glucose
+glue
+glut
+glutamate
+gnat
+gnu
+go-kart
+goal
+goat
+gobbler
+god
+goddess
+godfather
+godmother
+godparent
+goggles
+going
+gold
+goldfish
+golf
+gondola
+gong
+good
+good-bye
+goodbye
+goodie
+goodness
+goodnight
+goodwill
+goose
+gopher
+gorilla
+gosling
+gossip
+governance
+government
+governor
+gown
+grab-bag
+grace
+grade
+gradient
+graduate
+graduation
+graffiti
+graft
+grain
+gram
+grammar
+gran
+grand
+grandchild
+granddaughter
+grandfather
+grandma
+grandmom
+grandmother
+grandpa
+grandparent
+grandson
+granny
+granola
+grant
+grape
+grapefruit
+graph
+graphic
+grasp
+grass
+grasshopper
+grassland
+gratitude
+gravel
+gravitas
+gravity
+gravy
+gray
+grease
+great-grandfather
+great-grandmother
+greatness
+greed
+green
+greenhouse
+greens
+grenade
+grey
+grid
+grief
+grill
+grin
+grip
+gripper
+grit
+grocery
+ground
+group
+grouper
+grouse
+grove
+growth
+grub
+guacamole
+guarantee
+guard
+guava
+guerrilla
+guess
+guest
+guestbook
+guidance
+guide
+guideline
+guilder
+guilt
+guilty
+guinea
+guitar
+guitarist
+gum
+gumshoe
+gun
+gunpowder
+gutter
+guy
+gym
+gymnast
+gymnastics
+gynaecology
+gyro
+habit
+habitat
+hacienda
+hacksaw
+hackwork
+hail
+hair
+haircut
+hake
+half
+half-brother
+half-sister
+halibut
+hall
+halloween
+hallway
+halt
+ham
+hamburger
+hammer
+hammock
+hamster
+hand
+hand-holding
+handball
+handful
+handgun
+handicap
+handle
+handlebar
+handmaiden
+handover
+handrail
+handsaw
+hanger
+happening
+happiness
+harald
+harbor
+harbour
+hard-hat
+hardboard
+hardcover
+hardening
+hardhat
+hardship
+hardware
+hare
+harm
+harmonica
+harmonise
+harmonize
+harmony
+harp
+harpooner
+harpsichord
+harvest
+harvester
+hash
+hashtag
+hassock
+haste
+hat
+hatbox
+hatchet
+hatchling
+hate
+hatred
+haunt
+haven
+haversack
+havoc
+hawk
+hay
+haze
+hazel
+hazelnut
+head
+headache
+headlight
+headline
+headphones
+headquarters
+headrest
+health
+health-care
+hearing
+hearsay
+heart
+heart-throb
+heartache
+heartbeat
+hearth
+hearthside
+heartwood
+heat
+heater
+heating
+heaven
+heavy
+hectare
+hedge
+hedgehog
+heel
+heifer
+height
+heir
+heirloom
+helicopter
+helium
+hell
+hellcat
+hello
+helmet
+helo
+help
+hemisphere
+hemp
+hen
+hepatitis
+herb
+herbs
+heritage
+hermit
+hero
+heroine
+heron
+herring
+hesitation
+heterosexual
+hexagon
+heyday
+hiccups
+hide
+hierarchy
+high
+high-rise
+highland
+highlight
+highway
+hike
+hiking
+hill
+hint
+hip
+hippodrome
+hippopotamus
+hire
+hiring
+historian
+history
+hit
+hive
+hobbit
+hobby
+hockey
+hoe
+hog
+hold
+holder
+hole
+holiday
+home
+homeland
+homeownership
+hometown
+homework
+homicide
+homogenate
+homonym
+homosexual
+homosexuality
+honesty
+honey
+honeybee
+honeydew
+honor
+honoree
+hood
+hoof
+hook
+hop
+hope
+hops
+horde
+horizon
+hormone
+horn
+hornet
+horror
+horse
+horseradish
+horst
+hose
+hosiery
+hospice
+hospital
+hospitalisation
+hospitality
+hospitalization
+host
+hostel
+hostess
+hotdog
+hotel
+hound
+hour
+hourglass
+house
+houseboat
+household
+housewife
+housework
+housing
+hovel
+hovercraft
+howard
+howitzer
+hub
+hubcap
+hubris
+hug
+hugger
+hull
+human
+humanity
+humidity
+hummus
+humor
+humour
+hunchback
+hundred
+hunger
+hunt
+hunter
+hunting
+hurdle
+hurdler
+hurricane
+hurry
+hurt
+husband
+hut
+hutch
+hyacinth
+hybridisation
+hybridization
+hydrant
+hydraulics
+hydrocarb
+hydrocarbon
+hydrofoil
+hydrogen
+hydrolyse
+hydrolysis
+hydrolyze
+hydroxyl
+hyena
+hygienic
+hype
+hyphenation
+hypochondria
+hypothermia
+hypothesis
+ice
+ice-cream
+iceberg
+icebreaker
+icecream
+icicle
+icing
+icon
+icy
+id
+idea
+ideal
+identification
+identity
+ideology
+idiom
+idiot
+igloo
+ignorance
+ignorant
+ikebana
+illegal
+illiteracy
+illness
+illusion
+illustration
+image
+imagination
+imbalance
+imitation
+immigrant
+immigration
+immortal
+impact
+impairment
+impala
+impediment
+implement
+implementation
+implication
+import
+importance
+impostor
+impress
+impression
+imprisonment
+impropriety
+improvement
+impudence
+impulse
+in-joke
+in-laws
+inability
+inauguration
+inbox
+incandescence
+incarnation
+incense
+incentive
+inch
+incidence
+incident
+incision
+inclusion
+income
+incompetence
+inconvenience
+increase
+incubation
+independence
+independent
+index
+indication
+indicator
+indigence
+individual
+industrialisation
+industrialization
+industry
+inequality
+inevitable
+infancy
+infant
+infarction
+infection
+infiltration
+infinite
+infix
+inflammation
+inflation
+influence
+influx
+info
+information
+infrastructure
+infusion
+inglenook
+ingrate
+ingredient
+inhabitant
+inheritance
+inhibition
+inhibitor
+initial
+initialise
+initialize
+initiative
+injunction
+injury
+injustice
+ink
+inlay
+inn
+innervation
+innocence
+innocent
+innovation
+input
+inquiry
+inscription
+insect
+insectarium
+insert
+inside
+insight
+insolence
+insomnia
+inspection
+inspector
+inspiration
+installation
+instance
+instant
+instinct
+institute
+institution
+instruction
+instructor
+instrument
+instrumentalist
+instrumentation
+insulation
+insurance
+insurgence
+insurrection
+integer
+integral
+integration
+integrity
+intellect
+intelligence
+intensity
+intent
+intention
+intentionality
+interaction
+interchange
+interconnection
+intercourse
+interest
+interface
+interferometer
+interior
+interject
+interloper
+internet
+interpretation
+interpreter
+interval
+intervenor
+intervention
+interview
+interviewer
+intestine
+introduction
+intuition
+invader
+invasion
+invention
+inventor
+inventory
+inverse
+inversion
+investigation
+investigator
+investment
+investor
+invitation
+invite
+invoice
+involvement
+iridescence
+iris
+iron
+ironclad
+irony
+irrigation
+ischemia
+island
+isogloss
+isolation
+issue
+item
+itinerary
+ivory
+jack
+jackal
+jacket
+jackfruit
+jade
+jaguar
+jail
+jailhouse
+jalapeño
+jam
+jar
+jasmine
+jaw
+jazz
+jealousy
+jeans
+jeep
+jelly
+jellybeans
+jellyfish
+jerk
+jet
+jewel
+jeweller
+jewellery
+jewelry
+jicama
+jiffy
+job
+jockey
+jodhpurs
+joey
+jogging
+joint
+joke
+jot
+journal
+journalism
+journalist
+journey
+joy
+judge
+judgment
+judo
+jug
+juggernaut
+juice
+julienne
+jumbo
+jump
+jumper
+jumpsuit
+jungle
+junior
+junk
+junker
+junket
+jury
+justice
+justification
+jute
+kale
+kamikaze
+kangaroo
+karate
+kayak
+kazoo
+kebab
+keep
+keeper
+kendo
+kennel
+ketch
+ketchup
+kettle
+kettledrum
+key
+keyboard
+keyboarding
+keystone
+kick
+kick-off
+kid
+kidney
+kielbasa
+kill
+killer
+killing
+kilogram
+kilometer
+kilt
+kimono
+kinase
+kind
+kindness
+king
+kingdom
+kingfish
+kiosk
+kiss
+kit
+kitchen
+kite
+kitsch
+kitten
+kitty
+kiwi
+knee
+kneejerk
+knickers
+knife
+knife-edge
+knight
+knitting
+knock
+knot
+know-how
+knowledge
+knuckle
+koala
+kohlrabi
+kumquat
+lab
+label
+labor
+laboratory
+laborer
+labour
+labourer
+lace
+lack
+lacquerware
+lad
+ladder
+ladle
+lady
+ladybug
+lag
+lake
+lamb
+lambkin
+lament
+lamp
+lanai
+land
+landform
+landing
+landmine
+landscape
+lane
+language
+lantern
+lap
+laparoscope
+lapdog
+laptop
+larch
+lard
+larder
+lark
+larva
+laryngitis
+lasagna
+lashes
+last
+latency
+latex
+lathe
+latitude
+latte
+latter
+laugh
+laughter
+laundry
+lava
+law
+lawmaker
+lawn
+lawsuit
+lawyer
+lay
+layer
+layout
+lead
+leader
+leadership
+leading
+leaf
+league
+leaker
+leap
+learning
+leash
+leather
+leave
+leaver
+lecture
+leek
+leeway
+left
+leg
+legacy
+legal
+legend
+legging
+legislation
+legislator
+legislature
+legitimacy
+legume
+leisure
+lemon
+lemonade
+lemur
+lender
+lending
+length
+lens
+lentil
+leopard
+leprosy
+leptocephalus
+lesbian
+lesson
+letter
+lettuce
+level
+lever
+leverage
+leveret
+liability
+liar
+liberty
+libido
+library
+licence
+license
+licensing
+licorice
+lid
+lie
+lieu
+lieutenant
+life
+lifestyle
+lifetime
+lift
+ligand
+light
+lighting
+lightning
+lightscreen
+ligula
+likelihood
+likeness
+lilac
+lily
+limb
+lime
+limestone
+limit
+limitation
+limo
+line
+linen
+liner
+linguist
+linguistics
+lining
+link
+linkage
+linseed
+lion
+lip
+lipid
+lipoprotein
+lipstick
+liquid
+liquidity
+liquor
+list
+listening
+listing
+literate
+literature
+litigation
+litmus
+litter
+littleneck
+liver
+livestock
+living
+lizard
+llama
+load
+loading
+loaf
+loafer
+loan
+lobby
+lobotomy
+lobster
+local
+locality
+location
+lock
+locker
+locket
+locomotive
+locust
+lode
+loft
+log
+loggia
+logic
+login
+logistics
+logo
+loincloth
+lollipop
+loneliness
+longboat
+longitude
+look
+lookout
+loop
+loophole
+loquat
+lord
+loss
+lot
+lotion
+lottery
+lounge
+louse
+lout
+love
+lover
+lox
+loyalty
+luck
+luggage
+lumber
+lumberman
+lunch
+luncheonette
+lunchmeat
+lunchroom
+lung
+lunge
+lust
+lute
+luxury
+lychee
+lycra
+lye
+lymphocyte
+lynx
+lyocell
+lyre
+lyrics
+lysine
+mRNA
+macadamia
+macaroni
+macaroon
+macaw
+machine
+machinery
+macrame
+macro
+macrofauna
+madam
+maelstrom
+maestro
+magazine
+maggot
+magic
+magnet
+magnitude
+maid
+maiden
+mail
+mailbox
+mailer
+mailing
+mailman
+main
+mainland
+mainstream
+maintainer
+maintenance
+maize
+major
+major-league
+majority
+makeover
+maker
+makeup
+making
+male
+malice
+mall
+mallard
+mallet
+malnutrition
+mama
+mambo
+mammoth
+man
+manacle
+management
+manager
+manatee
+mandarin
+mandate
+mandolin
+mangle
+mango
+mangrove
+manhunt
+maniac
+manicure
+manifestation
+manipulation
+mankind
+manner
+manor
+mansard
+manservant
+mansion
+mantel
+mantle
+mantua
+manufacturer
+manufacturing
+many
+map
+maple
+mapping
+maracas
+marathon
+marble
+march
+mare
+margarine
+margin
+mariachi
+marimba
+marines
+marionberry
+mark
+marker
+market
+marketer
+marketing
+marketplace
+marksman
+markup
+marmalade
+marriage
+marsh
+marshland
+marshmallow
+marten
+marxism
+mascara
+mask
+masonry
+mass
+massage
+mast
+master
+masterpiece
+mastication
+mastoid
+mat
+match
+matchmaker
+mate
+material
+maternity
+math
+mathematics
+matrix
+matter
+mattock
+mattress
+max
+maximum
+maybe
+mayonnaise
+mayor
+meadow
+meal
+mean
+meander
+meaning
+means
+meantime
+measles
+measure
+measurement
+meat
+meatball
+meatloaf
+mecca
+mechanic
+mechanism
+med
+medal
+media
+median
+medication
+medicine
+medium
+meet
+meeting
+melatonin
+melody
+melon
+member
+membership
+membrane
+meme
+memo
+memorial
+memory
+men
+menopause
+menorah
+mention
+mentor
+menu
+merchandise
+merchant
+mercury
+meridian
+meringue
+merit
+mesenchyme
+mess
+message
+messenger
+messy
+metabolite
+metal
+metallurgist
+metaphor
+meteor
+meteorology
+meter
+methane
+method
+methodology
+metric
+metro
+metronome
+mezzanine
+microlending
+micronutrient
+microphone
+microwave
+mid-course
+midden
+middle
+middleman
+midline
+midnight
+midwife
+might
+migrant
+migration
+mile
+mileage
+milepost
+milestone
+military
+milk
+milkshake
+mill
+millennium
+millet
+millimeter
+million
+millisecond
+millstone
+mime
+mimosa
+min
+mincemeat
+mind
+mine
+mineral
+mineshaft
+mini
+mini-skirt
+minibus
+minimalism
+minimum
+mining
+minion
+minister
+mink
+minnow
+minor
+minor-league
+minority
+mint
+minute
+miracle
+mirror
+miscarriage
+miscommunication
+misfit
+misnomer
+misogyny
+misplacement
+misreading
+misrepresentation
+miss
+missile
+mission
+missionary
+mist
+mistake
+mister
+misunderstand
+miter
+mitten
+mix
+mixer
+mixture
+moai
+moat
+mob
+mobile
+mobility
+mobster
+moccasins
+mocha
+mochi
+mode
+model
+modeling
+modem
+modernist
+modernity
+modification
+molar
+molasses
+molding
+mole
+molecule
+mom
+moment
+monastery
+monasticism
+money
+monger
+monitor
+monitoring
+monk
+monkey
+monocle
+monopoly
+monotheism
+monsoon
+monster
+month
+monument
+mood
+moody
+moon
+moonlight
+moonscape
+moonshine
+moose
+mop
+morale
+morbid
+morbidity
+morning
+moron
+morphology
+morsel
+mortal
+mortality
+mortgage
+mortise
+mosque
+mosquito
+most
+motel
+moth
+mother
+mother-in-law
+motion
+motivation
+motive
+motor
+motorboat
+motorcar
+motorcycle
+mound
+mountain
+mouse
+mouser
+mousse
+moustache
+mouth
+mouton
+movement
+mover
+movie
+mower
+mozzarella
+mud
+muffin
+mug
+mukluk
+mule
+multimedia
+murder
+muscat
+muscatel
+muscle
+musculature
+museum
+mushroom
+music
+music-box
+music-making
+musician
+muskrat
+mussel
+mustache
+mustard
+mutation
+mutt
+mutton
+mycoplasma
+mystery
+myth
+mythology
+nail
+name
+naming
+nanoparticle
+napkin
+narrative
+nasal
+nation
+nationality
+native
+naturalisation
+nature
+navigation
+necessity
+neck
+necklace
+necktie
+nectar
+nectarine
+need
+needle
+neglect
+negligee
+negotiation
+neighbor
+neighborhood
+neighbour
+neighbourhood
+neologism
+neon
+neonate
+nephew
+nerve
+nest
+nestling
+nestmate
+net
+netball
+netbook
+netsuke
+network
+networking
+neurobiologist
+neuron
+neuropathologist
+neuropsychiatry
+news
+newsletter
+newspaper
+newsprint
+newsstand
+nexus
+nibble
+nicety
+niche
+nick
+nickel
+nickname
+niece
+night
+nightclub
+nightgown
+nightingale
+nightlife
+nightlight
+nightmare
+ninja
+nit
+nitrogen
+nobody
+nod
+node
+noir
+noise
+nonbeliever
+nonconformist
+nondisclosure
+nonsense
+noodle
+noodles
+noon
+norm
+normal
+normalisation
+normalization
+north
+nose
+notation
+note
+notebook
+notepad
+nothing
+notice
+notion
+notoriety
+nougat
+noun
+nourishment
+novel
+nucleotidase
+nucleotide
+nudge
+nuke
+number
+numeracy
+numeric
+numismatist
+nun
+nurse
+nursery
+nursing
+nurture
+nut
+nutmeg
+nutrient
+nutrition
+nylon
+nymph
+oak
+oar
+oasis
+oat
+oatmeal
+oats
+obedience
+obesity
+obi
+object
+objection
+objective
+obligation
+oboe
+observation
+observatory
+obsession
+obsidian
+obstacle
+occasion
+occupation
+occurrence
+ocean
+ocelot
+octagon
+octave
+octavo
+octet
+octopus
+odometer
+odyssey
+oeuvre
+off-ramp
+offence
+offense
+offer
+offering
+office
+officer
+official
+offset
+oil
+okra
+oldie
+oleo
+olive
+omega
+omelet
+omission
+omnivore
+oncology
+onion
+online
+onset
+opening
+opera
+operating
+operation
+operator
+ophthalmologist
+opinion
+opium
+opossum
+opponent
+opportunist
+opportunity
+opposite
+opposition
+optimal
+optimisation
+optimist
+optimization
+option
+orange
+orangutan
+orator
+orchard
+orchestra
+orchid
+order
+ordinary
+ordination
+ore
+oregano
+organ
+organisation
+organising
+organization
+organizing
+orient
+orientation
+origin
+original
+originality
+ornament
+osmosis
+osprey
+ostrich
+other
+otter
+ottoman
+ounce
+outback
+outcome
+outfielder
+outfit
+outhouse
+outlaw
+outlay
+outlet
+outline
+outlook
+output
+outrage
+outrigger
+outrun
+outset
+outside
+oval
+ovary
+oven
+overcharge
+overclocking
+overcoat
+overexertion
+overflight
+overhead
+overheard
+overload
+overnighter
+overshoot
+oversight
+overview
+overweight
+owl
+owner
+ownership
+ox
+oxford
+oxygen
+oyster
+ozone
+pace
+pacemaker
+pack
+package
+packaging
+packet
+pad
+paddle
+paddock
+pagan
+page
+pagoda
+pail
+pain
+paint
+painter
+painting
+paintwork
+pair
+pajamas
+palace
+palate
+palm
+pamphlet
+pan
+pancake
+pancreas
+panda
+panel
+panic
+pannier
+panpipe
+pansy
+panther
+panties
+pantologist
+pantology
+pantry
+pants
+pantsuit
+panty
+pantyhose
+papa
+papaya
+paper
+paperback
+paperwork
+parable
+parachute
+parade
+paradise
+paragraph
+parallelogram
+paramecium
+paramedic
+parameter
+paranoia
+parcel
+parchment
+pard
+pardon
+parent
+parenthesis
+parenting
+park
+parka
+parking
+parliament
+parole
+parrot
+parser
+parsley
+parsnip
+part
+participant
+participation
+particle
+particular
+partner
+partnership
+partridge
+party
+pass
+passage
+passbook
+passenger
+passing
+passion
+passive
+passport
+password
+past
+pasta
+paste
+pastor
+pastoralist
+pastry
+pasture
+pat
+patch
+pate
+patent
+patentee
+path
+pathogenesis
+pathology
+pathway
+patience
+patient
+patina
+patio
+patriarch
+patrimony
+patriot
+patrol
+patroller
+patrolling
+patron
+pattern
+patty
+pattypan
+pause
+pavement
+pavilion
+paw
+pawnshop
+pay
+payee
+payment
+payoff
+pea
+peace
+peach
+peacoat
+peacock
+peak
+peanut
+pear
+pearl
+peasant
+pecan
+pecker
+pedal
+peek
+peen
+peer
+peer-to-peer
+pegboard
+pelican
+pelt
+pen
+penalty
+pence
+pencil
+pendant
+pendulum
+penguin
+penicillin
+peninsula
+penis
+pennant
+penny
+pension
+pentagon
+peony
+people
+pepper
+pepperoni
+percent
+percentage
+perception
+perch
+perennial
+perfection
+performance
+perfume
+period
+periodical
+peripheral
+permafrost
+permission
+permit
+perp
+perpendicular
+persimmon
+person
+personal
+personality
+personnel
+perspective
+pest
+pet
+petal
+petition
+petitioner
+petticoat
+pew
+pharmacist
+pharmacopoeia
+phase
+pheasant
+phenomenon
+phenotype
+pheromone
+philanthropy
+philosopher
+philosophy
+phone
+phosphate
+photo
+photodiode
+photograph
+photographer
+photography
+photoreceptor
+phrase
+phrasing
+physical
+physics
+physiology
+pianist
+piano
+piccolo
+pick
+pickax
+pickaxe
+picket
+pickle
+pickup
+picnic
+picture
+picturesque
+pie
+piece
+pier
+piety
+pig
+pigeon
+piglet
+pigpen
+pigsty
+pike
+pilaf
+pile
+pilgrim
+pilgrimage
+pill
+pillar
+pillbox
+pillow
+pilot
+pimp
+pimple
+pin
+pinafore
+pince-nez
+pine
+pineapple
+pinecone
+ping
+pink
+pinkie
+pinot
+pinstripe
+pint
+pinto
+pinworm
+pioneer
+pipe
+pipeline
+piracy
+pirate
+piss
+pistol
+pit
+pita
+pitch
+pitcher
+pitching
+pith
+pizza
+place
+placebo
+placement
+placode
+plagiarism
+plain
+plaintiff
+plan
+plane
+planet
+planning
+plant
+plantation
+planter
+planula
+plaster
+plasterboard
+plastic
+plate
+platelet
+platform
+platinum
+platter
+platypus
+play
+player
+playground
+playroom
+playwright
+plea
+pleasure
+pleat
+pledge
+plenty
+plier
+pliers
+plight
+plot
+plough
+plover
+plow
+plowman
+plug
+plugin
+plum
+plumber
+plume
+plunger
+plywood
+pneumonia
+pocket
+pocket-watch
+pocketbook
+pod
+podcast
+poem
+poet
+poetry
+poignance
+point
+poison
+poisoning
+poker
+polarisation
+polarization
+pole
+polenta
+police
+policeman
+policy
+polish
+politician
+politics
+poll
+polliwog
+pollutant
+pollution
+polo
+polyester
+polyp
+pomegranate
+pomelo
+pompom
+poncho
+pond
+pony
+pool
+poor
+pop
+popcorn
+poppy
+popsicle
+popularity
+population
+populist
+porcelain
+porch
+porcupine
+pork
+porpoise
+port
+porter
+portfolio
+porthole
+portion
+portrait
+position
+possession
+possibility
+possible
+post
+postage
+postbox
+poster
+posterior
+postfix
+pot
+potato
+potential
+pottery
+potty
+pouch
+poultry
+pound
+pounding
+poverty
+powder
+power
+practice
+practitioner
+prairie
+praise
+pray
+prayer
+precedence
+precedent
+precipitation
+precision
+predecessor
+preface
+preference
+prefix
+pregnancy
+prejudice
+prelude
+premeditation
+premier
+premise
+premium
+preoccupation
+preparation
+prescription
+presence
+present
+presentation
+preservation
+preserves
+presidency
+president
+press
+pressroom
+pressure
+pressurisation
+pressurization
+prestige
+presume
+pretzel
+prevalence
+prevention
+prey
+price
+pricing
+pride
+priest
+priesthood
+primary
+primate
+prince
+princess
+principal
+principle
+print
+printer
+printing
+prior
+priority
+prison
+prisoner
+privacy
+private
+privilege
+prize
+prizefight
+probability
+probation
+probe
+problem
+procedure
+proceedings
+process
+processing
+processor
+proctor
+procurement
+produce
+producer
+product
+production
+productivity
+profession
+professional
+professor
+profile
+profit
+progenitor
+program
+programme
+programming
+progress
+progression
+prohibition
+project
+proliferation
+promenade
+promise
+promotion
+prompt
+pronoun
+pronunciation
+proof
+proof-reader
+propaganda
+propane
+property
+prophet
+proponent
+proportion
+proposal
+proposition
+proprietor
+prose
+prosecution
+prosecutor
+prospect
+prosperity
+prostacyclin
+prostanoid
+prostrate
+protection
+protein
+protest
+protocol
+providence
+provider
+province
+provision
+prow
+proximal
+proximity
+prune
+pruner
+pseudocode
+pseudoscience
+psychiatrist
+psychoanalyst
+psychologist
+psychology
+ptarmigan
+pub
+public
+publication
+publicity
+publisher
+publishing
+pudding
+puddle
+puffin
+pug
+puggle
+pulley
+pulse
+puma
+pump
+pumpernickel
+pumpkin
+pumpkinseed
+pun
+punch
+punctuation
+punishment
+pup
+pupa
+pupil
+puppet
+puppy
+purchase
+puritan
+purity
+purple
+purpose
+purr
+purse
+pursuit
+push
+pusher
+put
+puzzle
+pyramid
+pyridine
+quadrant
+quail
+qualification
+quality
+quantity
+quart
+quarter
+quartet
+quartz
+queen
+query
+quest
+question
+questioner
+questionnaire
+quiche
+quicksand
+quiet
+quill
+quilt
+quince
+quinoa
+quit
+quiver
+quota
+quotation
+quote
+rabbi
+rabbit
+raccoon
+race
+racer
+racing
+racism
+racist
+rack
+radar
+radiator
+radio
+radiosonde
+radish
+raffle
+raft
+rag
+rage
+raid
+rail
+railing
+railroad
+railway
+raiment
+rain
+rainbow
+raincoat
+rainmaker
+rainstorm
+rainy
+raise
+raisin
+rake
+rally
+ram
+rambler
+ramen
+ramie
+ranch
+rancher
+randomisation
+randomization
+range
+ranger
+rank
+rap
+rape
+raspberry
+rat
+rate
+ratepayer
+rating
+ratio
+rationale
+rations
+raven
+ravioli
+rawhide
+ray
+rayon
+razor
+reach
+reactant
+reaction
+read
+reader
+readiness
+reading
+real
+reality
+realization
+realm
+reamer
+rear
+reason
+reasoning
+rebel
+rebellion
+reboot
+recall
+recapitulation
+receipt
+receiver
+reception
+receptor
+recess
+recession
+recipe
+recipient
+reciprocity
+reclamation
+recliner
+recognition
+recollection
+recommendation
+reconsideration
+record
+recorder
+recording
+recovery
+recreation
+recruit
+rectangle
+red
+redesign
+redhead
+redirect
+rediscovery
+reduction
+reef
+refectory
+reference
+referendum
+reflection
+reform
+refreshments
+refrigerator
+refuge
+refund
+refusal
+refuse
+regard
+regime
+region
+regionalism
+register
+registration
+registry
+regret
+regulation
+regulator
+rehospitalisation
+rehospitalization
+reindeer
+reinscription
+reject
+relation
+relationship
+relative
+relaxation
+relay
+release
+reliability
+relief
+religion
+relish
+reluctance
+remains
+remark
+reminder
+remnant
+remote
+removal
+renaissance
+rent
+reorganisation
+reorganization
+repair
+reparation
+repayment
+repeat
+replacement
+replica
+replication
+reply
+report
+reporter
+reporting
+repository
+representation
+representative
+reprocessing
+republic
+republican
+reputation
+request
+requirement
+resale
+rescue
+research
+researcher
+resemblance
+reservation
+reserve
+reservoir
+reset
+residence
+resident
+residue
+resist
+resistance
+resolution
+resolve
+resort
+resource
+respect
+respite
+response
+responsibility
+rest
+restaurant
+restoration
+restriction
+restroom
+restructuring
+result
+resume
+retailer
+retention
+rethinking
+retina
+retirement
+retouching
+retreat
+retrospect
+retrospective
+retrospectivity
+return
+reunion
+revascularisation
+revascularization
+reveal
+revelation
+revenant
+revenge
+revenue
+reversal
+reverse
+review
+revitalisation
+revitalization
+revival
+revolution
+revolver
+reward
+rhetoric
+rheumatism
+rhinoceros
+rhubarb
+rhyme
+rhythm
+rib
+ribbon
+rice
+riddle
+ride
+rider
+ridge
+riding
+rifle
+right
+rim
+ring
+ringworm
+riot
+rip
+ripple
+rise
+riser
+risk
+rite
+ritual
+river
+riverbed
+rivulet
+road
+roadway
+roar
+roast
+robe
+robin
+robot
+robotics
+rock
+rocker
+rocket
+rocket-ship
+rod
+role
+roll
+roller
+romaine
+romance
+roof
+room
+roommate
+rooster
+root
+rope
+rose
+rosemary
+roster
+rostrum
+rotation
+round
+roundabout
+route
+router
+routine
+row
+rowboat
+rowing
+rubber
+rubbish
+rubric
+ruby
+ruckus
+rudiment
+ruffle
+rug
+rugby
+ruin
+rule
+ruler
+ruling
+rum
+rumor
+run
+runaway
+runner
+running
+runway
+rush
+rust
+rutabaga
+rye
+sabre
+sac
+sack
+saddle
+sadness
+safari
+safe
+safeguard
+safety
+saffron
+sage
+sail
+sailboat
+sailing
+sailor
+saint
+sake
+salad
+salami
+salary
+sale
+salesman
+salmon
+salon
+saloon
+salsa
+salt
+salute
+samovar
+sampan
+sample
+samurai
+sanction
+sanctity
+sanctuary
+sand
+sandal
+sandbar
+sandpaper
+sandwich
+sanity
+sardine
+sari
+sarong
+sash
+satellite
+satin
+satire
+satisfaction
+sauce
+saucer
+sauerkraut
+sausage
+savage
+savannah
+saving
+savings
+savior
+saviour
+savory
+saw
+saxophone
+scaffold
+scale
+scallion
+scallops
+scalp
+scam
+scanner
+scarecrow
+scarf
+scarification
+scenario
+scene
+scenery
+scent
+schedule
+scheduling
+schema
+scheme
+schizophrenic
+schnitzel
+scholar
+scholarship
+school
+schoolhouse
+schooner
+science
+scientist
+scimitar
+scissors
+scooter
+scope
+score
+scorn
+scorpion
+scotch
+scout
+scow
+scrambled
+scrap
+scraper
+scratch
+screamer
+screen
+screening
+screenwriting
+screw
+screw-up
+screwdriver
+scrim
+scrip
+script
+scripture
+scrutiny
+sculpting
+sculptural
+sculpture
+sea
+seabass
+seafood
+seagull
+seal
+seaplane
+search
+seashore
+seaside
+season
+seat
+seaweed
+second
+secrecy
+secret
+secretariat
+secretary
+secretion
+section
+sectional
+sector
+security
+sediment
+seed
+seeder
+seeker
+seep
+segment
+seizure
+selection
+self
+self-confidence
+self-control
+self-esteem
+seller
+selling
+semantics
+semester
+semicircle
+semicolon
+semiconductor
+seminar
+senate
+senator
+sender
+senior
+sense
+sensibility
+sensitive
+sensitivity
+sensor
+sentence
+sentencing
+sentiment
+sepal
+separation
+septicaemia
+sequel
+sequence
+serial
+series
+sermon
+serum
+serval
+servant
+server
+service
+servitude
+sesame
+session
+set
+setback
+setting
+settlement
+settler
+severity
+sewer
+sex
+sexuality
+shack
+shackle
+shade
+shadow
+shadowbox
+shakedown
+shaker
+shallot
+shallows
+shame
+shampoo
+shanty
+shape
+share
+shareholder
+shark
+shaw
+shawl
+shear
+shearling
+sheath
+shed
+sheep
+sheet
+shelf
+shell
+shelter
+sherbet
+sherry
+shield
+shift
+shin
+shine
+shingle
+ship
+shipper
+shipping
+shipyard
+shirt
+shirtdress
+shit
+shoat
+shock
+shoe
+shoe-horn
+shoehorn
+shoelace
+shoemaker
+shoes
+shoestring
+shofar
+shoot
+shootdown
+shop
+shopper
+shopping
+shore
+shoreline
+short
+shortage
+shorts
+shortwave
+shot
+shoulder
+shout
+shovel
+show
+show-stopper
+shower
+shred
+shrimp
+shrine
+shutdown
+sibling
+sick
+sickness
+side
+sideboard
+sideburns
+sidecar
+sidestream
+sidewalk
+siding
+siege
+sigh
+sight
+sightseeing
+sign
+signal
+signature
+signet
+significance
+signify
+signup
+silence
+silica
+silicon
+silk
+silkworm
+sill
+silly
+silo
+silver
+similarity
+simple
+simplicity
+simplification
+simvastatin
+sin
+singer
+singing
+singular
+sink
+sinuosity
+sip
+sir
+sister
+sister-in-law
+sitar
+site
+situation
+size
+skate
+skating
+skean
+skeleton
+ski
+skiing
+skill
+skin
+skirt
+skull
+skullcap
+skullduggery
+skunk
+sky
+skylight
+skyline
+skyscraper
+skywalk
+slang
+slapstick
+slash
+slate
+slave
+slavery
+slaw
+sled
+sledge
+sleep
+sleepiness
+sleeping
+sleet
+sleuth
+slice
+slide
+slider
+slime
+slip
+slipper
+slippers
+slope
+slot
+sloth
+slump
+smell
+smelting
+smile
+smith
+smock
+smog
+smoke
+smoking
+smolt
+smuggling
+snack
+snail
+snake
+snakebite
+snap
+snarl
+sneaker
+sneakers
+sneeze
+sniffle
+snob
+snorer
+snow
+snowboarding
+snowflake
+snowman
+snowmobiling
+snowplow
+snowstorm
+snowsuit
+snuck
+snug
+snuggle
+soap
+soccer
+socialism
+socialist
+society
+sociology
+sock
+socks
+soda
+sofa
+softball
+softdrink
+softening
+software
+soil
+soldier
+sole
+solicitation
+solicitor
+solidarity
+solidity
+soliloquy
+solitaire
+solution
+solvency
+sombrero
+somebody
+someone
+someplace
+somersault
+something
+somewhere
+son
+sonar
+sonata
+song
+songbird
+sonnet
+soot
+sophomore
+soprano
+sorbet
+sorghum
+sorrel
+sorrow
+sort
+soul
+soulmate
+sound
+soundness
+soup
+source
+sourwood
+sousaphone
+south
+southeast
+souvenir
+sovereignty
+sow
+soy
+soybean
+space
+spacing
+spade
+spaghetti
+span
+spandex
+spank
+sparerib
+spark
+sparrow
+spasm
+spat
+spatula
+spawn
+speaker
+speakerphone
+speaking
+spear
+spec
+special
+specialist
+specialty
+species
+specification
+spectacle
+spectacles
+spectrograph
+spectrum
+speculation
+speech
+speed
+speedboat
+spell
+spelling
+spelt
+spending
+sphere
+sphynx
+spice
+spider
+spiderling
+spike
+spill
+spinach
+spine
+spiral
+spirit
+spiritual
+spirituality
+spit
+spite
+spleen
+splendor
+split
+spokesman
+spokeswoman
+sponge
+sponsor
+sponsorship
+spool
+spoon
+spork
+sport
+sportsman
+spot
+spotlight
+spouse
+sprag
+sprat
+spray
+spread
+spreadsheet
+spree
+spring
+sprinkles
+sprinter
+sprout
+spruce
+spud
+spume
+spur
+spy
+spyglass
+square
+squash
+squatter
+squeegee
+squid
+squirrel
+stab
+stability
+stable
+stack
+stacking
+stadium
+staff
+stag
+stage
+stain
+stair
+staircase
+stake
+stalk
+stall
+stallion
+stamen
+stamina
+stamp
+stance
+stand
+standard
+standardisation
+standardization
+standing
+standoff
+standpoint
+star
+starboard
+start
+starter
+state
+statement
+statin
+station
+station-wagon
+statistic
+statistics
+statue
+status
+statute
+stay
+steak
+stealth
+steam
+steamroller
+steel
+steeple
+stem
+stench
+stencil
+step
+step-aunt
+step-brother
+step-daughter
+step-father
+step-grandfather
+step-grandmother
+step-mother
+step-sister
+step-son
+step-uncle
+stepdaughter
+stepmother
+stepping-stone
+stepson
+stereo
+stew
+steward
+stick
+sticker
+stiletto
+still
+stimulation
+stimulus
+sting
+stinger
+stir-fry
+stitch
+stitcher
+stock
+stock-in-trade
+stockings
+stole
+stomach
+stone
+stonework
+stool
+stop
+stopsign
+stopwatch
+storage
+store
+storey
+storm
+story
+story-telling
+storyboard
+stot
+stove
+strait
+strand
+stranger
+strap
+strategy
+straw
+strawberry
+strawman
+stream
+street
+streetcar
+strength
+stress
+stretch
+strife
+strike
+string
+strip
+stripe
+strobe
+stroke
+structure
+strudel
+struggle
+stucco
+stud
+student
+studio
+study
+stuff
+stumbling
+stump
+stupidity
+sturgeon
+sty
+style
+styling
+stylus
+sub
+subcomponent
+subconscious
+subcontractor
+subexpression
+subgroup
+subject
+submarine
+submitter
+subprime
+subroutine
+subscription
+subsection
+subset
+subsidence
+subsidiary
+subsidy
+substance
+substitution
+subtitle
+suburb
+subway
+success
+succotash
+suck
+sucker
+suede
+suet
+suffocation
+sugar
+suggestion
+suicide
+suit
+suitcase
+suite
+sulfur
+sultan
+sum
+summary
+summer
+summit
+sun
+sunbeam
+sunbonnet
+sundae
+sunday
+sundial
+sunflower
+sunglasses
+sunlamp
+sunlight
+sunrise
+sunroom
+sunset
+sunshine
+superiority
+supermarket
+supernatural
+supervision
+supervisor
+supper
+supplement
+supplier
+supply
+support
+supporter
+suppression
+supreme
+surface
+surfboard
+surge
+surgeon
+surgery
+surname
+surplus
+surprise
+surround
+surroundings
+surrounds
+survey
+survival
+survivor
+sushi
+suspect
+suspenders
+suspension
+sustainment
+sustenance
+swallow
+swamp
+swan
+swanling
+swath
+sweat
+sweater
+sweatshirt
+sweatshop
+sweatsuit
+sweets
+swell
+swim
+swimming
+swimsuit
+swine
+swing
+switch
+switchboard
+switching
+swivel
+sword
+swordfight
+swordfish
+sycamore
+symbol
+symmetry
+sympathy
+symptom
+syndicate
+syndrome
+synergy
+synod
+synonym
+synthesis
+syrup
+system
+t-shirt
+tab
+tabby
+tabernacle
+table
+tablecloth
+tablet
+tabletop
+tachometer
+tackle
+taco
+tactics
+tactile
+tadpole
+tag
+tail
+tailbud
+tailor
+tailspin
+take-out
+takeover
+tale
+talent
+talk
+talking
+tam-o'-shanter
+tamale
+tambour
+tambourine
+tan
+tandem
+tangerine
+tank
+tank-top
+tanker
+tankful
+tap
+tape
+tapioca
+target
+taro
+tarragon
+tart
+task
+tassel
+taste
+tatami
+tattler
+tattoo
+tavern
+tax
+taxi
+taxicab
+taxpayer
+tea
+teacher
+teaching
+team
+teammate
+teapot
+tear
+tech
+technician
+technique
+technologist
+technology
+tectonics
+teen
+teenager
+teepee
+telephone
+telescreen
+teletype
+television
+tell
+teller
+temp
+temper
+temperature
+temple
+tempo
+temporariness
+temporary
+temptation
+temptress
+tenant
+tendency
+tender
+tenement
+tenet
+tennis
+tenor
+tension
+tensor
+tent
+tentacle
+tenth
+tepee
+teriyaki
+term
+terminal
+termination
+terminology
+termite
+terrace
+terracotta
+terrapin
+terrarium
+territory
+terror
+terrorism
+terrorist
+test
+testament
+testimonial
+testimony
+testing
+text
+textbook
+textual
+texture
+thanks
+thaw
+theater
+theft
+theism
+theme
+theology
+theory
+therapist
+therapy
+thermals
+thermometer
+thermostat
+thesis
+thickness
+thief
+thigh
+thing
+thinking
+thirst
+thistle
+thong
+thongs
+thorn
+thought
+thousand
+thread
+threat
+threshold
+thrift
+thrill
+throat
+throne
+thrush
+thrust
+thug
+thumb
+thump
+thunder
+thunderbolt
+thunderhead
+thunderstorm
+thyme
+tiara
+tic
+tick
+ticket
+tide
+tie
+tiger
+tights
+tile
+till
+tilt
+timbale
+timber
+time
+timeline
+timeout
+timer
+timetable
+timing
+timpani
+tin
+tinderbox
+tinkle
+tintype
+tip
+tire
+tissue
+titanium
+title
+toad
+toast
+toaster
+tobacco
+today
+toe
+toenail
+toffee
+tofu
+tog
+toga
+toilet
+tolerance
+tolerant
+toll
+tom-tom
+tomatillo
+tomato
+tomb
+tomography
+tomorrow
+ton
+tonality
+tone
+tongue
+tonic
+tonight
+tool
+toot
+tooth
+toothbrush
+toothpaste
+toothpick
+top
+top-hat
+topic
+topsail
+toque
+toreador
+tornado
+torso
+torte
+tortellini
+tortilla
+tortoise
+tosser
+total
+tote
+touch
+tough-guy
+tour
+tourism
+tourist
+tournament
+tow-truck
+towel
+tower
+town
+townhouse
+township
+toy
+trace
+trachoma
+track
+tracking
+tracksuit
+tract
+tractor
+trade
+trader
+trading
+tradition
+traditionalism
+traffic
+trafficker
+tragedy
+trail
+trailer
+trailpatrol
+train
+trainer
+training
+trait
+tram
+tramp
+trance
+transaction
+transcript
+transfer
+transformation
+transit
+transition
+translation
+transmission
+transom
+transparency
+transplantation
+transport
+transportation
+trap
+trapdoor
+trapezium
+trapezoid
+trash
+travel
+traveler
+tray
+treasure
+treasury
+treat
+treatment
+treaty
+tree
+trek
+trellis
+tremor
+trench
+trend
+triad
+trial
+triangle
+tribe
+tributary
+trick
+trigger
+trigonometry
+trillion
+trim
+trinket
+trip
+tripod
+tritone
+triumph
+trolley
+trombone
+troop
+trooper
+trophy
+trouble
+trousers
+trout
+trove
+trowel
+truck
+trumpet
+trunk
+trust
+trustee
+truth
+try
+tsunami
+tub
+tuba
+tube
+tuber
+tug
+tugboat
+tuition
+tulip
+tumbler
+tummy
+tuna
+tune
+tune-up
+tunic
+tunnel
+turban
+turf
+turkey
+turmeric
+turn
+turning
+turnip
+turnover
+turnstile
+turret
+turtle
+tusk
+tussle
+tutu
+tuxedo
+tweet
+tweezers
+twig
+twilight
+twine
+twins
+twist
+twister
+twitter
+type
+typeface
+typewriter
+typhoon
+ukulele
+ultimatum
+umbrella
+unblinking
+uncertainty
+uncle
+underclothes
+underestimate
+underground
+underneath
+underpants
+underpass
+undershirt
+understanding
+understatement
+undertaker
+underwear
+underweight
+underwire
+underwriting
+unemployment
+unibody
+uniform
+uniformity
+union
+unique
+unit
+unity
+universe
+university
+update
+upgrade
+uplift
+upper
+upstairs
+upward
+urge
+urgency
+urn
+usage
+use
+user
+usher
+usual
+utensil
+utilisation
+utility
+utilization
+vacation
+vaccine
+vacuum
+vagrant
+valance
+valentine
+validate
+validity
+valley
+valuable
+value
+vampire
+van
+vanadyl
+vane
+vanilla
+vanity
+variability
+variable
+variant
+variation
+variety
+vascular
+vase
+vault
+vaulting
+veal
+vector
+vegetable
+vegetarian
+vegetarianism
+vegetation
+vehicle
+veil
+vein
+veldt
+vellum
+velocity
+velodrome
+velvet
+vendor
+veneer
+vengeance
+venison
+venom
+venti
+venture
+venue
+veranda
+verb
+verdict
+verification
+vermicelli
+vernacular
+verse
+version
+vertigo
+verve
+vessel
+vest
+vestment
+vet
+veteran
+veterinarian
+veto
+viability
+vibe
+vibraphone
+vibration
+vibrissae
+vice
+vicinity
+victim
+victory
+video
+view
+viewer
+vignette
+villa
+village
+vine
+vinegar
+vineyard
+vintage
+vintner
+vinyl
+viola
+violation
+violence
+violet
+violin
+virginal
+virtue
+virus
+visa
+viscose
+vise
+vision
+visit
+visitor
+visor
+vista
+visual
+vitality
+vitamin
+vitro
+vivo
+vixen
+vodka
+vogue
+voice
+void
+vol
+volatility
+volcano
+volleyball
+volume
+volunteer
+volunteering
+vomit
+vote
+voter
+voting
+voyage
+vulture
+wad
+wafer
+waffle
+wage
+wagon
+waist
+waistband
+wait
+waiter
+waiting
+waitress
+waiver
+wake
+walk
+walker
+walking
+walkway
+wall
+wallaby
+wallet
+walnut
+walrus
+wampum
+wannabe
+want
+war
+warden
+wardrobe
+warfare
+warlock
+warlord
+warm-up
+warming
+warmth
+warning
+warrant
+warren
+warrior
+wasabi
+wash
+washbasin
+washcloth
+washer
+washtub
+wasp
+waste
+wastebasket
+wasting
+watch
+watcher
+watchmaker
+water
+waterbed
+watercress
+waterfall
+waterfront
+watermelon
+waterskiing
+waterspout
+waterwheel
+wave
+waveform
+wax
+way
+weakness
+wealth
+weapon
+wear
+weasel
+weather
+web
+webinar
+webmail
+webpage
+website
+wedding
+wedge
+weed
+weeder
+weedkiller
+week
+weekend
+weekender
+weight
+weird
+welcome
+welfare
+well
+well-being
+west
+western
+wet-bar
+wetland
+wetsuit
+whack
+whale
+wharf
+wheat
+wheel
+whelp
+whey
+whip
+whirlpool
+whirlwind
+whisker
+whiskey
+whisper
+whistle
+white
+whole
+wholesale
+wholesaler
+whorl
+wick
+widget
+widow
+width
+wife
+wifi
+wild
+wildebeest
+wilderness
+wildlife
+will
+willingness
+willow
+win
+wind
+wind-chime
+windage
+window
+windscreen
+windshield
+wine
+winery
+wing
+wingman
+wingtip
+wink
+winner
+winter
+wire
+wiretap
+wiring
+wisdom
+wiseguy
+wish
+wisteria
+wit
+witch
+witch-hunt
+withdrawal
+witness
+wok
+wolf
+woman
+wombat
+wonder
+wont
+wood
+woodchuck
+woodland
+woodshed
+woodwind
+wool
+woolens
+word
+wording
+work
+workbench
+worker
+workforce
+workhorse
+working
+workout
+workplace
+workshop
+world
+worm
+worry
+worship
+worshiper
+worth
+wound
+wrap
+wraparound
+wrapper
+wrapping
+wreck
+wrecker
+wren
+wrench
+wrestler
+wriggler
+wrinkle
+wrist
+writer
+writing
+wrong
+xylophone
+yacht
+yahoo
+yak
+yam
+yang
+yard
+yarmulke
+yarn
+yawl
+year
+yeast
+yellow
+yellowjacket
+yesterday
+yew
+yin
+yoga
+yogurt
+yoke
+yolk
+young
+youngster
+yourself
+youth
+yoyo
+yurt
+zampone
+zebra
+zebrafish
+zen
+zephyr
+zero
+ziggurat
+zinc
+zipper
+zither
+zombie
+zone
+zoo
+zoologist
+zoology
+zoot-suit
+zucchini
diff --git a/dashtools/data/randomWords.py b/dashtools/data/randomWords.py
new file mode 100644
index 0000000..9da286f
--- /dev/null
+++ b/dashtools/data/randomWords.py
@@ -0,0 +1,25 @@
+'''
+ # @ Author: Andrew Hossack
+ # @ Create Time: 2022-05-23 12:48:14
+ # Generate interesting app names
+'''
+
+import random
+from pkg_resources import resource_filename
+import os
+
+
+def _get_data_path(filename: os.PathLike) -> os.PathLike:
+    """
+    Get the path to the data directory.
+    """
+    return resource_filename(__name__, filename)
+
+
+def get_words(N: int) -> list:
+    """
+    Get N random words from the data file.
+    """
+    with open(_get_data_path('nounlist.csv'), 'r') as f:
+        words = f.read().splitlines()
+    return [words[i] for i in sorted(random.sample(range(len(words)), N))]
diff --git a/dash_tools/templating/__init__.py b/dashtools/deploy/__init__.py
similarity index 100%
rename from dash_tools/templating/__init__.py
rename to dashtools/deploy/__init__.py
diff --git a/dash_tools/deploy/deployHeroku.py b/dashtools/deploy/deployHeroku.py
similarity index 51%
rename from dash_tools/deploy/deployHeroku.py
rename to dashtools/deploy/deployHeroku.py
index 7f22351..d36ad75 100644
--- a/dash_tools/deploy/deployHeroku.py
+++ b/dashtools/deploy/deployHeroku.py
@@ -6,9 +6,8 @@
 import re
 import subprocess
 import webbrowser
-from typing import Union
 
-from dash_tools.deploy import fileUtils, gitUtils, herokuUtils
+from dashtools.deploy import fileUtils, gitUtils, herokuUtils
 
 
 def _check_required_files_exist(root_path: os.PathLike) -> bool:
@@ -18,29 +17,29 @@ def _check_required_files_exist(root_path: os.PathLike) -> bool:
     deploy_should_continue = True
     # Check if procfile exists
     if not fileUtils.check_file_exists(root_path, 'Procfile'):
-        if _prompt_user_choice(
-                'dash-tools: deploy-heroku: Required file Procfile not found. Create one automatically?'):
+        if prompt_user_choice(
+                'dashtools: Required file Procfile not found. Create one automatically?'):
             fileUtils.create_procfile(root_path)
         else:
             deploy_should_continue = False
     # Check for the Runtime file
     if (not fileUtils.check_file_exists(root_path, 'runtime.txt')) and deploy_should_continue:
-        if _prompt_user_choice(
-                'dash-tools: deploy-heroku: Required file runtime.txt not found. Create one automatically?'):
+        if prompt_user_choice(
+                'dashtools: Required file runtime.txt not found. Create one automatically?'):
             fileUtils.create_runtime_txt(root_path)
         else:
             deploy_should_continue = False
     # Check for the Requirements file
     if (not fileUtils.check_file_exists(root_path, 'requirements.txt')) and deploy_should_continue:
-        if _prompt_user_choice(
-                'dash-tools: deploy-heroku: Required file requirements.txt not found. Create one automatically?'):
+        if prompt_user_choice(
+                'dashtools: Required file requirements.txt not found. Create one automatically?'):
             fileUtils.create_requirements_txt(root_path)
         else:
             deploy_should_continue = False
     return deploy_should_continue
 
 
-def _prompt_user_choice(message: str, prompt: str = 'Continue? (y/n) > ', does_repeat: bool = True) -> bool:
+def prompt_user_choice(message: str, prompt: str = 'Continue? (y/n) > ', does_repeat: bool = True) -> bool:
     """
     Prompt the user to continue or not.
 
@@ -54,18 +53,18 @@ def _prompt_user_choice(message: str, prompt: str = 'Continue? (y/n) > ', does_r
         False (n/N)
     """
     print(message)
-    response = input(f'dash-tools: {prompt}')
+    response = input(f'dashtools: {prompt}')
     if response.lower() == 'y':
         return True
     elif response.lower() == 'n':
         return False
     elif does_repeat:
-        return _prompt_user_choice(message)
+        return prompt_user_choice(message)
     else:
         return False
 
 
-def _add_changes_and_push_to_heroku(heroku_app_name: str) -> bool:
+def _add_changes_and_push_to_heroku(heroku_app_name: str, remote: str = 'heroku') -> bool:
     """
     Add changes to the repository and push to Heroku
 
@@ -74,15 +73,15 @@ def _add_changes_and_push_to_heroku(heroku_app_name: str) -> bool:
         False (Failure)
     """
     # Create a commit to push to Heroku
-    print(f'dash-tools: deploy-heroku: Creating commit to push to Heroku')
+    print(f'dashtools: Creating commit to push to {remote}')
     os.system(f'git add .')
     os.system(
-        f'git commit -m "Deploy to Heroku for app {heroku_app_name} - dash-tools"')
+        f'git commit -m "Deploy to Heroku for app {heroku_app_name} - dashtools"')
     # Push to Heroku
-    print(f'dash-tools: deploy-heroku: Pushing to Heroku')
+    print(f'dashtools: Pushing to Heroku')
     try:
         subprocess.check_output(
-            f'git push heroku HEAD:master', shell=True)
+            f'git push {remote} HEAD:master', shell=True)
     except subprocess.CalledProcessError:
         return False
     return True
@@ -96,11 +95,11 @@ def _remove_heroku_remote():
         True if successful
         False if failed
     """
-    print('dash-tools: deploy-heroku: Removing existing heroku remote')
+    print('dashtools: Removing existing heroku remote')
     try:
         subprocess.check_output('git remote rm heroku', shell=True)
     except subprocess.CalledProcessError:
-        exit('dash-tools: deploy-heroku: Failed to remove heroku remote')
+        exit('dashtools: heroku: deploy: Failed to remove heroku remote')
 
 
 def _check_heroku_remote_already_exists() -> bool:
@@ -120,7 +119,7 @@ def _check_heroku_remote_already_exists() -> bool:
         except AttributeError:
             return False
     except subprocess.CalledProcessError:
-        exit('dash-tools: deploy-heroku: Failed to check if heroku remote is set')
+        exit('dashtools: heroku: deploy: Failed to check if heroku remote is set')
     return True
 
 
@@ -128,26 +127,39 @@ def _success_message(heroku_app_name: str):
     """
     Print a success message
     """
-    print(f'\n\ndash-tools: deploy-heroku: Successfully deployed to Heroku from git branch "heroku"!')
+    print(f'\n\ndashtools: Successfully deployed to Heroku from git branch "heroku"!')
     print(
-        f'dash-tools: deploy-heroku: To push changes, select the "Update Existing App" option after typing: dash-tools --deploy-heroku')
+        f'dashtools: To push changes, select the "Update Existing App" option after typing: dashtools --heroku: deploy')
     print(
-        f'dash-tools: deploy-heroku: Management Page: https://dashboard.heroku.com/apps/{heroku_app_name}')
+        f'dashtools: Management Page: https://dashboard.heroku.com/apps/{heroku_app_name}')
     print(
-        f'dash-tools: deploy-heroku: Application Page: https://{heroku_app_name}.herokuapp.com/')
+        f'dashtools: Application Page: https://{heroku_app_name}.herokuapp.com/')
 
     # Prompt user to open the deployed app
-    if input('dash-tools: deploy-heroku: Enter any key to open in browser or q to exit > ') != 'q':
+    if input('dashtools: Enter any key to open in browser or q to exit > ') != 'q':
         webbrowser.open(f'https://{heroku_app_name}.herokuapp.com/')
 
+    print('dashtools: heroku: deploy: Finished')
 
-def _get_valid_app_name(heroku_app_name: str) -> str:
+
+def update_heroku_app(remote: str = 'heroku'):
+    """
+    Updates the existing heroku app
+
+    Args:
+        remote(str): Remote to update. Default 'heroku'
+    """
+    if not _add_changes_and_push_to_heroku('update', remote=remote):
+        exit('dashtools: heroku: deploy: Failed to push to heroku')
+    print('dashtools: Changes pushed to heroku remote')
+    exit('dashtools: heroku: update: Success')
+
+
+def _get_valid_app_name() -> str:
     """
     Returns a unique and valid heroku app name
     """
-    # Generate or let user type in app name if it is not provided
-    if not heroku_app_name:
-        heroku_app_name = herokuUtils.get_heroku_app_name()
+    heroku_app_name = herokuUtils.get_heroku_app_name()
 
     # Wait for user to input a correct name
     should_continue = False
@@ -155,98 +167,105 @@ def _get_valid_app_name(heroku_app_name: str) -> str:
         # Check if the project already exists on Heroku if name is specified
         if not herokuUtils.check_heroku_app_name_available(heroku_app_name):
             print(
-                f'dash-tools: deploy-heroku: App "{heroku_app_name}" already exists on Heroku!')
+                f'dashtools: App "{heroku_app_name}" already exists on Heroku!')
             print(
-                'dash-tools: deploy-heroku: Please choose a unique name that isn\'t already taken.')
+                'dashtools: Please choose a unique name that isn\'t already taken.')
             heroku_app_name = herokuUtils.get_heroku_app_name()
         elif not herokuUtils.validate_heroku_app_name(heroku_app_name):
             print(
-                f'dash-tools: deploy-heroku: App name "{heroku_app_name}" is not valid!')
-            print('dash-tools: deploy-heroku: Heroku app names must start with a letter, end with a letter or digit, can only contain lowercase letters, numbers, and dashes, and have a minimum length of 3 characters.')
+                f'dashtools: App name "{heroku_app_name}" is not valid!')
+            print('dashtools: Heroku app names must start with a letter, end with a letter or digit, can only contain lowercase letters, numbers, and dashes, and have a minimum length of 3 characters.')
             heroku_app_name = herokuUtils.get_heroku_app_name()
         else:
             should_continue = True
     return heroku_app_name
 
 
-def deploy_app_to_heroku(project_root_dir: os.PathLike, heroku_app_name: Union[str, None]):
+def deploy_app_to_heroku(project_root_dir: os.PathLike):
     """
     Uses the Heroku CLI to deploy the current project
     """
-    print('dash-tools: deploy-heroku: Starting')
+    print('dashtools: heroku: deploy: Starting')
 
     # Check if heroku CLI is installed
     if not herokuUtils.heroku_is_installed():
-        print(f'dash-tools: deploy-heroku: Heroku CLI not installed!')
-        print(f'dash-tools: deploy-heroku: See https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli')
-        exit('dash-tools: deploy-heroku: Failed')
+        print(f'dashtools: Heroku CLI not installed!')
+        print(f'dashtools: See https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli')
+        # Prompt user to open the deployed app
+        if input('dashtools: Enter any key to open in browser or q to exit > ') != 'q':
+            webbrowser.open(
+                'https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli')
+        exit('dashtools: heroku: deploy: Failed')
 
     # Check if git is installed
     if not gitUtils.git_is_installed():
-        print(f'dash-tools: deploy-heroku: Git not installed!')
-        print(f'dash-tools: deploy-heroku: See https://git-scm.com/downloads')
-        exit('dash-tools: deploy-heroku: Failed')
+        print(f'dashtools: Git not installed!')
+        print(f'dashtools: See https://git-scm.com/downloads')
+        # Prompt user to open the deployed app
+        if input('dashtools: Enter any key to open in browser or q to exit > ') != 'q':
+            webbrowser.open('https://git-scm.com/downloads')
+        exit('dashtools: heroku: deploy: Failed')
 
     # Check that git is initialized in the current repo
     if not gitUtils.is_git_repository():
-        print(f'dash-tools: deploy-heroku: Current directory is not a git repository!')
-        print('dash-tools: deploy-heroku: To start a git repository, type: git init')
-        exit('dash-tools: deploy-heroku: Failed')
+        print(f'dashtools: Current directory is not a git repository!')
+        # Prompt user to init git
+        if prompt_user_choice('dashtools: Would you like to init git?'):
+            os.system('git init')
+        else:
+            print('dashtools: To start a git repository, type: git init')
+            exit('dashtools: heroku: deploy: Failed')
 
     # Check that heroku remote is not already set
     if _check_heroku_remote_already_exists():
-        print(f'dash-tools: deploy-heroku: Git remote "heroku" is already set!')
-        print('dash-tools: deploy-heroku: Please choose an option below:')
+        print(f'dashtools: Git remote "heroku" is already set!')
+        print('dashtools: Please choose an option below:')
         print('\t1. Push to the existing heroku remote (Update Existing App)')
         print('\t2. Remove the heroku remote and continue (Create New App)')
         print('\t3. Abort')
-        should_continue = False
-        while not should_continue:
-            response = input('dash-tools: Choice (1, 2, 3) > ')
+        while True:
+            response = input('dashtools: Choice (1, 2, 3) > ')
             if response == '1':
-                if not _add_changes_and_push_to_heroku(heroku_app_name):
-                    exit('dash-tools: deploy-heroku: Failed to push to heroku')
-                print('dash-tools: deploy-heroku: Changes pushed to heroku remote')
-                exit('dash-tools: deploy-heroku: Success')
+                update_heroku_app()
             elif response == '2':
                 _remove_heroku_remote()
-                should_continue = True
+                break
             elif response == '3':
-                exit('dash-tools: deploy-heroku: Aborted')
+                exit('dashtools: heroku: deploy: Aborted')
             else:
-                should_continue = False
+                pass
 
     # Get a unique app name
-    heroku_app_name = _get_valid_app_name(heroku_app_name)
+    heroku_app_name = _get_valid_app_name()
 
     # Check that the project has necessary files
     if not _check_required_files_exist(project_root_dir):
-        print('dash-tools: deploy-heroku: Procfile, runtime.txt, and requirements.txt are needed for Heroku deployment.')
-        exit('dash-tools: deploy-heroku: Aborted')
+        print('dashtools: Procfile, runtime.txt, and requirements.txt are needed for Heroku deployment.')
+        exit('dashtools: heroku: deploy: Aborted')
 
     # Check procfile is correct
     procfile = fileUtils.verify_procfile(project_root_dir)
     if not procfile['valid']:
         print(
-            f'dash-tools: deploy-heroku: Procfile is incorrect. Did you include "{procfile["hook"]} = app.server" after instantiating "app = Dash(...)" in {procfile["dir"]}/{procfile["module"]}?')
-        exit('dash-tools: deploy-heroku: Failed')
+            f'dashtools: Procfile is incorrect. Did you include "{procfile["hook"]} = app.server" after instantiating "app = Dash(...)" in {procfile["dir"]}/{procfile["module"]}?')
+        exit('dashtools: heroku: deploy: Failed')
 
     # Log into Heroku
     if not herokuUtils.login_heroku_successful():
-        print(f'dash-tools: deploy-heroku: Heroku login failed.')
-        exit('dash-tools: deploy-heroku: Failed')
+        print(f'dashtools: Heroku login failed.')
+        exit('dashtools: heroku: deploy: Failed')
 
     # Confirm deployment settings and create the project on Heroku if the user confirms
-    if not _prompt_user_choice(f'dash-tools: deploy-heroku: Please confirm creating app {heroku_app_name} on Heroku and adding git remote "heroku".'):
-        exit('dash-tools: deploy-heroku: Aborted')
+    if not prompt_user_choice(f'dashtools: Please confirm creating app {heroku_app_name} on Heroku and adding git remote "heroku".'):
+        exit('dashtools: heroku: deploy: Aborted')
 
     # Create the project on Heroku and capture the git remote URL
     if not herokuUtils.create_app_on_heroku(heroku_app_name):
         exit(
-            f'dash-tools: deploy-heroku: Deploying app {heroku_app_name} to Heroku failed.')
+            f'dashtools: heroku: deploy: Deploying app {heroku_app_name} to Heroku failed.')
 
     # Add python buildpack
-    print(f'dash-tools: deploy-heroku: Adding python buildpack')
+    print(f'dashtools: Adding python buildpack')
     os.system(f'heroku buildpacks:add heroku/python -a {heroku_app_name}')
 
     # Push to Heroku
diff --git a/dash_tools/deploy/fileUtils.py b/dashtools/deploy/fileUtils.py
similarity index 89%
rename from dash_tools/deploy/fileUtils.py
rename to dashtools/deploy/fileUtils.py
index 1943c32..657914a 100644
--- a/dash_tools/deploy/fileUtils.py
+++ b/dashtools/deploy/fileUtils.py
@@ -22,16 +22,16 @@ def create_requirements_txt(root_path: os.PathLike):
     """
     Creates requirements.txt file using pipreqs
     """
-    print('dash-tools: deploy-heroku: Creating requirements.txt')
+    print('dashtools: deploy-heroku: Creating requirements.txt')
     try:
         subprocess.check_output(f'pipreqs {root_path}', shell=True)
     except subprocess.CalledProcessError:
         # pipreqs throws a SyntaxError if it encounters a non-ASCII character
         # One reason may be that the user is not in a valid dash app directory
         print(
-            f'dash-tools: deploy-heroku: Error creating requirements.txt')
-        print('dash-tools: deploy-heroku: Did you run --deploy-heroku in a valid dash app directory?')
-        exit('dash-tools: deploy-heroku: Failed')
+            f'dashtools: deploy-heroku: Error creating requirements.txt')
+        print('dashtools: deploy-heroku: Did you run --deploy-heroku in a valid dash app directory?')
+        exit('dashtools: deploy-heroku: Failed')
     # Append gunicorn to requirements.txt
     with open(os.path.join(root_path, 'requirements.txt'), 'a') as requirements_file:
         requirements_file.write('gunicorn')
@@ -44,7 +44,7 @@ def create_runtime_txt(root_path: os.PathLike):
     """
     with open(os.path.join(root_path, 'runtime.txt'), 'w') as runtime_file:
         runtime_file.write('python-3.8.10')
-    print('dash-tools: deploy-heroku: Created runtime.txt using python-3.8.10')
+    print('dashtools: deploy-heroku: Created runtime.txt using python-3.8.10')
 
 
 def create_procfile(root_path: os.PathLike):
@@ -54,7 +54,7 @@ def create_procfile(root_path: os.PathLike):
     with open(os.path.join(root_path, 'Procfile'), 'w') as procfile:
         procfile.write(
             f'web: gunicorn --timeout 600 --chdir src app:server')
-    print(f'dash-tools: deploy-heroku: Created Procfile')
+    print(f'dashtools: deploy-heroku: Created Procfile')
 
 
 def verify_procfile(root_path: os.PathLike) -> dict:
@@ -68,8 +68,8 @@ def verify_procfile(root_path: os.PathLike) -> dict:
         {
             'valid': True (valid) or False (invalid),
             'dir': Directory of app,
-            'hook': Hook name
             'module': Module name
+            'hook': Hook name
         }
     """
     with open(os.path.join(root_path, 'Procfile'), 'r') as procfile:
diff --git a/dash_tools/deploy/gitUtils.py b/dashtools/deploy/gitUtils.py
similarity index 100%
rename from dash_tools/deploy/gitUtils.py
rename to dashtools/deploy/gitUtils.py
diff --git a/dash_tools/deploy/herokuUtils.py b/dashtools/deploy/herokuUtils.py
similarity index 79%
rename from dash_tools/deploy/herokuUtils.py
rename to dashtools/deploy/herokuUtils.py
index b086f27..b1c3c01 100644
--- a/dash_tools/deploy/herokuUtils.py
+++ b/dashtools/deploy/herokuUtils.py
@@ -7,7 +7,7 @@
 import re
 import string
 import subprocess
-
+from dashtools.data import randomWords
 import requests
 
 
@@ -32,7 +32,7 @@ def login_heroku_successful() -> bool:
     """
     Try to log into Heroku
     """
-    print(f'dash-tools: deploy-heroku: Logging into Heroku...')
+    print(f'dashtools: deploy-heroku: Logging into Heroku...')
     regex = r'Error: quit'
     loginWasSuccessful = True
     try:
@@ -57,7 +57,7 @@ def check_heroku_app_name_available(heroku_app_name: str) -> bool:
         if requests.get(f'https://{heroku_app_name}.herokuapp.com/', headers={'User-Agent': 'Custom'}).status_code == 404:
             return True
     except requests.exceptions.ConnectionError:
-        exit('dash-tools: deploy-heroku: Invalid Heroku app name')
+        exit('dashtools: deploy-heroku: Invalid Heroku app name')
     return False
 
 
@@ -68,7 +68,7 @@ def create_app_on_heroku(app_name: str) -> bool:
     Returns:
         Success of the operation (True/False)
     """
-    print(f'dash-tools: deploy-heroku: Creating {app_name} on Heroku')
+    print(f'dashtools: deploy-heroku: Creating {app_name} on Heroku')
     url_regex = r'https:\/\/git\.heroku\.com\/[a-zA-Z0-9-_]*\.git'
     try:
         heroku_command_output = subprocess.check_output(
@@ -89,15 +89,14 @@ def get_heroku_app_name():
     """
     Create or generate app name if one isn't provided
     """
-    print('dash-tools: deploy-heroku: Please type a unique app name or press enter to generate one automatically.')
-    app_name = input('dash-tools: App Name (Optional) > ')
+    print('dashtools: deploy-heroku: Please type a unique app name or press enter to generate one automatically.')
+    app_name = input('dashtools: App Name (Optional) > ')
     if app_name == '':
-        # Generate a random app name
-        app_name = ''.join(random.choices(
-            string.ascii_lowercase + string.digits, k=12))
-        # App names must start with letter. Use 'dt-' for dash-tools
-        app_name = ''.join(('dt-', app_name))
-    print(f'dash-tools: deploy-heroku: Using app name "{app_name}"')
+        # Generate a random app name with three words
+        app_name = '-'.join(randomWords.get_words(3))
+        # Append alphanumeric characters to the end of the app name
+        app_name += f"-{''.join(random.choices(string.ascii_lowercase + string.digits, k=4))}"
+    print(f'dashtools: deploy-heroku: Using app name "{app_name}"')
     return app_name
 
 
diff --git a/dashtools/runtime/__init__.py b/dashtools/runtime/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dashtools/runtime/runtimeUtils.py b/dashtools/runtime/runtimeUtils.py
new file mode 100644
index 0000000..3927162
--- /dev/null
+++ b/dashtools/runtime/runtimeUtils.py
@@ -0,0 +1,43 @@
+'''
+ # @ Author: Andrew Hossack
+ # @ Create Time: 2022-05-23 00:08:07
+ # @ Handle running the app
+'''
+
+
+import os
+from dashtools.deploy.fileUtils import verify_procfile, check_file_exists
+
+
+def run_app(root_path: os.PathLike):
+    '''
+    Look for a Procfile to run the app, else recursive search for app.py file
+    # TODO verify this works for all systems. Not sure if python3 is correct cmd
+    '''
+    # Check Procfile exists
+    if check_file_exists(root_path, 'Procfile'):
+        # Look for a Procfile to run the app, else recursive search for app.py file
+        proc = verify_procfile(root_path)
+        if proc['valid']:
+            try:
+                print('dashtools: Running From Procfile')
+                os.chdir(root_path)
+                # NOTE Not too sure if python3 is the right command for all systems, it might need to be changed
+                os.system(
+                    f'python3 -m {proc["dir"]}.{proc["module"].replace(".py","")}')
+            except Exception as e:
+                print(e)
+    else:
+        # Find app.py file in the root_path directory
+        for root, dirs, files in os.walk(root_path):
+            if 'app.py' in files:
+                break
+        try:
+            print(
+                f'dashtools: Running From {root + "/" if root else ""}app.py')
+            os.chdir(root)
+            # NOTE Not too sure if python3 is the right command for all systems, it might need to be changed
+            os.system(f'python3 app.py')
+        except Exception as e:
+            print(e)
+    return
diff --git a/dash_tools/templating/Templates.py b/dashtools/templating/Templates.py
similarity index 92%
rename from dash_tools/templating/Templates.py
rename to dashtools/templating/Templates.py
index fd0079a..b642ce3 100644
--- a/dash_tools/templating/Templates.py
+++ b/dashtools/templating/Templates.py
@@ -19,6 +19,8 @@ class Template(Enum):
     ADVANCED = 'advanced'
     CSV = 'csv'
     DEFAULT = 'default'
+    FASTDASH = 'fastdash'
+    ICONIFY = 'iconify'
     IRIS = 'iris'
     MANTINE = 'mantine'
     MULTIPAGE = 'multipage'
diff --git a/dashtools/templating/__init__.py b/dashtools/templating/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dash_tools/templating/buildTemplate.py b/dashtools/templating/buildApp.py
similarity index 64%
rename from dash_tools/templating/buildTemplate.py
rename to dashtools/templating/buildApp.py
index 7130086..6f03c17 100644
--- a/dash_tools/templating/buildTemplate.py
+++ b/dashtools/templating/buildApp.py
@@ -1,15 +1,14 @@
 '''
  # @ Author: Andrew Hossack
  # @ Create Time: 2022-04-01 13:57:48
- # Build dash apps with dash-tools
+ # Build dash apps with dashtools
 '''
 
 import datetime
 import os
 import shutil
-from typing import Union
 
-from dash_tools.templating import templateUtils
+from dashtools.templating import buildAppUtils
 
 
 def _format_file(name: os.PathLike, app_name: str, dest: os.PathLike):
@@ -31,37 +30,24 @@ def _format_file(name: os.PathLike, app_name: str, dest: os.PathLike):
                 f.write(content)
 
 
-def _check_write_permission(path: os.PathLike) -> bool:
-    """
-    Check for write permission in directory/
-
-    Returns:
-        True if write access else allowed False
-    """
-    return os.access(path, os.W_OK)
-
-
-def create_app(base_dir: os.PathLike, app_name: str, use_template: Union[templateUtils.Template, str]):
+def create_app(target_dir: os.PathLike, app_name: str, template: buildAppUtils.Template):
     '''
     Create a new app in the target directory.
 
     Looks for files in the /template directory
     '''
     # Check arguments
-    templateUtils.check_create_app_args(base_dir, app_name)
-    use_template = templateUtils.convert_to_template_or_error(use_template)
-    print(
-        f'dash-tools: init: Creating new app "{app_name}" at {os.path.join(base_dir, app_name)} using {use_template}')
+    buildAppUtils.check_create_app_args(target_dir, app_name)
 
     # Check for file write permissions in the base directory (command invoke directory)
-    if not _check_write_permission(base_dir):
+    if not buildAppUtils.check_write_permission(target_dir):
         print(
-            f'dash-tools: init: No write permissions for {base_dir}')
-        exit(f'dash-tools: init: Failed')
+            f'dashtools: init: No write permissions for {target_dir}')
+        exit(f'dashtools: init: Failed')
 
     # Copy files from template directory
-    template = os.path.join('templates', use_template.value)
-    template_base_path = templateUtils.get_templates_data_path(template)
+    template_dir = os.path.join('templates', template.value)
+    template_base_path = buildAppUtils.get_templates_data_path(template_dir)
     for path, _, files in os.walk(template_base_path):
         for name in files:
             # Skip non .template files
@@ -75,7 +61,7 @@ def create_app(base_dir: os.PathLike, app_name: str, use_template: Union[templat
 
             # Get the destination path
             rel_path = relative_path if relative_path != '.' else ''
-            dest = os.path.join(base_dir, app_name, rel_path, name)
+            dest = os.path.join(target_dir, app_name, rel_path, name)
             dest = dest.replace('.template', '')
             dest = dest.replace(r'{appName}', app_name)
 
@@ -89,4 +75,5 @@ def create_app(base_dir: os.PathLike, app_name: str, use_template: Union[templat
             # Format the file
             _format_file(name, app_name, dest)
 
-    print(f'dash-tools: init: Finished')
+    print(
+        f'dashtools: init: Created new app {app_name} at {os.path.join(target_dir, app_name)} with {template.name} template')
diff --git a/dash_tools/templating/templateUtils.py b/dashtools/templating/buildAppUtils.py
similarity index 63%
rename from dash_tools/templating/templateUtils.py
rename to dashtools/templating/buildAppUtils.py
index f7e5cc7..6ef57d7 100644
--- a/dash_tools/templating/templateUtils.py
+++ b/dashtools/templating/buildAppUtils.py
@@ -6,7 +6,17 @@
 from typing import Union
 from pkg_resources import resource_filename
 import os
-from dash_tools.templating.Templates import Template
+from dashtools.templating.Templates import Template
+
+
+def check_write_permission(path: os.PathLike) -> bool:
+    """
+    Check for write permission in directory/
+
+    Returns:
+        True if write access else allowed False
+    """
+    return os.access(path, os.W_OK)
 
 
 def print_templates():
@@ -23,10 +33,10 @@ def check_create_app_args(base_dir, app_name):
     """
     app_dir = os.path.join(base_dir, app_name)
     if os.path.exists(app_dir):
-        print(f'dash-tools: init: App {app_dir} already exists.')
+        print(f'dashtools: init: App {app_dir} already exists.')
         print(
-            f'dash-tools: init: Please change the "{app_dir}" name or delete the {app_dir} directory!')
-        exit(f'dash-tools: init: Failed')
+            f'dashtools: init: Please change the "{app_dir}" name or delete the {app_dir} directory!')
+        exit(f'dashtools: init: Failed')
 
 
 def get_templates_data_path(data_dir: os.PathLike) -> os.PathLike:
@@ -39,23 +49,21 @@ def get_templates_data_path(data_dir: os.PathLike) -> os.PathLike:
 def get_template_from_args(args: argparse.Namespace) -> Union[str, Template]:
     """
     Get the template to use based on the arguments passed to the CLI.
-
     If the user passed in a template, use that, otherwise use the `default`.
-
-    # TODO This function could be rolled into convert_to_template_or_error
     """
-    return args.init[1] if len(
+    possible_template = args.init[1] if len(
         args.init) > 1 else Template.DEFAULT
+    return _convert_to_template_or_error(possible_template)
 
 
-def convert_to_template_or_error(value) -> Template:
+def _convert_to_template_or_error(value) -> Template:
     """
     Convert the string passed to the init command to a template.
     """
     try:
         return Template(value)
     except ValueError:
-        print(f'dash-tools: init: Template "{value}" is not a valid template.')
+        print(f'dashtools: init: Template "{value}" is not a valid template.')
         print('Valid templates are:')
         print_templates()
         exit(1)
diff --git a/dashtools/templating/createTemplate.py b/dashtools/templating/createTemplate.py
new file mode 100644
index 0000000..c50f160
--- /dev/null
+++ b/dashtools/templating/createTemplate.py
@@ -0,0 +1,86 @@
+'''
+ # @ Author: Andrew Hossack
+ # @ Create Time: 2022-05-22 22:21:30
+ # @ Used to create new templates from a directory
+'''
+
+import os
+import shutil
+
+from dashtools.deploy import deployHeroku, fileUtils
+from dashtools.templating import buildAppUtils
+
+
+def create_template(src: os.PathLike, dest: os.PathLike):
+    """
+    Recursively copies all files and directories from src. Appends '.template' to all files.
+    Saves new template to parent directory of src.
+    """
+
+    if not os.path.exists(src):
+        print(f"dashtools: templates: init: Source file {src} does not exist")
+        exit('dashtools: templates: init: Failed')
+
+    # Check for file write permissions in the base directory (command invoke directory)
+    if not buildAppUtils.check_write_permission(dest):
+        print(
+            f'dashtools: templates: init: No write permissions for {dest}')
+        exit(f'dashtools: templates: init: Failed')
+
+    # Create the new template directory
+    src = os.path.join(src, '')
+    template_base_dir = os.path.join(dest, f'{os.path.normpath(src)}Template')
+    if os.path.exists(template_base_dir):
+        print(
+            f'dashtools: templates: init: Template directory {template_base_dir} already exists')
+        exit(f'dashtools: templates: init: Failed')
+
+    # Check Procfile exists
+    if not fileUtils.check_file_exists(src, 'Procfile'):
+        print(
+            f'dashtools: templates: init: No Procfile found in {src}')
+        if deployHeroku.prompt_user_choice("dashtools: templates: init: Create Procfile?"):
+            fileUtils.create_procfile(src)
+
+    # Verify procfile
+    if not fileUtils.verify_procfile(src)["valid"]:
+        print(
+            f'dashtools: templates: init: Procfile in {src} is invalid')
+        if not deployHeroku.prompt_user_choice("dashtools: Continue?"):
+            exit(f'dashtools: templates: init: Aborted')
+
+    # Check runtime exists
+    if not fileUtils.check_file_exists(src, 'runtime.py'):
+        print(
+            f'dashtools: templates: init: No runtime.py found in {src}')
+        if deployHeroku.prompt_user_choice("dashtools: templates: init: Create runtime.py?"):
+            fileUtils.create_runtime_txt(src)
+
+    # Make the new template directory
+    os.mkdir(template_base_dir)
+    # Copy files from src to template_base_dir, appending '.template' to all files
+    for path, _, files in os.walk(src):
+        for name in files:
+            # Skip already .template files
+            if('.template' in name):
+                continue
+
+            # Get the relative path to the file
+            relative_path = os.path.relpath(
+                path, src)
+            rel_src = os.path.join(path, name)
+
+            # Get the destination path
+            rel_dest = relative_path if relative_path != '.' else ''
+            dest = os.path.join(
+                template_base_dir,
+                rel_dest,
+                name +
+                '.template')
+
+            # Create the directory if it doesn't exist
+            if not os.path.exists(os.path.dirname(dest)):
+                os.makedirs(os.path.dirname(dest))
+
+            # Copy the file
+            shutil.copyfile(rel_src, dest)
diff --git a/dash_tools/templating/templates/advanced/Procfile.template b/dashtools/templating/templates/advanced/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/Procfile.template
rename to dashtools/templating/templates/advanced/Procfile.template
diff --git a/dash_tools/templating/templates/advanced/README.md.template b/dashtools/templating/templates/advanced/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/README.md.template
rename to dashtools/templating/templates/advanced/README.md.template
diff --git a/dash_tools/templating/templates/advanced/runtime.txt.template b/dashtools/templating/templates/advanced/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/runtime.txt.template
rename to dashtools/templating/templates/advanced/runtime.txt.template
diff --git a/dash_tools/templating/templates/advanced/src/__init__.py.template b/dashtools/templating/templates/advanced/src/__init__.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/__init__.py.template
rename to dashtools/templating/templates/advanced/src/__init__.py.template
diff --git a/dash_tools/templating/templates/advanced/src/app.py.template b/dashtools/templating/templates/advanced/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/app.py.template
rename to dashtools/templating/templates/advanced/src/app.py.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/confetti_effect.js.template b/dashtools/templating/templates/advanced/src/assets/confetti_effect.js.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/confetti_effect.js.template
rename to dashtools/templating/templates/advanced/src/assets/confetti_effect.js.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/favicon.ico.template b/dashtools/templating/templates/advanced/src/assets/favicon.ico.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/favicon.ico.template
rename to dashtools/templating/templates/advanced/src/assets/favicon.ico.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Black.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BlackIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Bold.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-BoldIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBold.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ExtraBoldIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Light.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-LightIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Medium.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-MediumIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Regular.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-RegularIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBold.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-SemiBoldIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-Thin.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.eot.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.eot.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.eot.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.eot.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.ttf.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.ttf.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.ttf.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.ttf.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff2.template b/dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff2.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff2.template
rename to dashtools/templating/templates/advanced/src/assets/font/ProximaSoft-ThinIt.woff2.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/img/banner.svg.template b/dashtools/templating/templates/advanced/src/assets/img/banner.svg.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/img/banner.svg.template
rename to dashtools/templating/templates/advanced/src/assets/img/banner.svg.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/img/loader.gif.template b/dashtools/templating/templates/advanced/src/assets/img/loader.gif.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/img/loader.gif.template
rename to dashtools/templating/templates/advanced/src/assets/img/loader.gif.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/loading.css.template b/dashtools/templating/templates/advanced/src/assets/loading.css.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/loading.css.template
rename to dashtools/templating/templates/advanced/src/assets/loading.css.template
diff --git a/dash_tools/templating/templates/advanced/src/assets/style.css.template b/dashtools/templating/templates/advanced/src/assets/style.css.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/assets/style.css.template
rename to dashtools/templating/templates/advanced/src/assets/style.css.template
diff --git a/dash_tools/templating/templates/advanced/src/components/__init__.py.template b/dashtools/templating/templates/advanced/src/components/__init__.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/components/__init__.py.template
rename to dashtools/templating/templates/advanced/src/components/__init__.py.template
diff --git a/dash_tools/templating/templates/advanced/src/components/footer.py.template b/dashtools/templating/templates/advanced/src/components/footer.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/components/footer.py.template
rename to dashtools/templating/templates/advanced/src/components/footer.py.template
diff --git a/dash_tools/templating/templates/advanced/src/components/navbar.py.template b/dashtools/templating/templates/advanced/src/components/navbar.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/components/navbar.py.template
rename to dashtools/templating/templates/advanced/src/components/navbar.py.template
diff --git a/dash_tools/templating/templates/advanced/src/containers/__init__.py.template b/dashtools/templating/templates/advanced/src/containers/__init__.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/containers/__init__.py.template
rename to dashtools/templating/templates/advanced/src/containers/__init__.py.template
diff --git a/dash_tools/templating/templates/advanced/src/containers/about.py.template b/dashtools/templating/templates/advanced/src/containers/about.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/containers/about.py.template
rename to dashtools/templating/templates/advanced/src/containers/about.py.template
diff --git a/dash_tools/templating/templates/advanced/src/containers/error.py.template b/dashtools/templating/templates/advanced/src/containers/error.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/containers/error.py.template
rename to dashtools/templating/templates/advanced/src/containers/error.py.template
diff --git a/dash_tools/templating/templates/advanced/src/containers/home.py.template b/dashtools/templating/templates/advanced/src/containers/home.py.template
similarity index 100%
rename from dash_tools/templating/templates/advanced/src/containers/home.py.template
rename to dashtools/templating/templates/advanced/src/containers/home.py.template
diff --git a/dash_tools/templating/templates/csv/Procfile.template b/dashtools/templating/templates/csv/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/csv/Procfile.template
rename to dashtools/templating/templates/csv/Procfile.template
diff --git a/dash_tools/templating/templates/csv/README.md.template b/dashtools/templating/templates/csv/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/csv/README.md.template
rename to dashtools/templating/templates/csv/README.md.template
diff --git a/dash_tools/templating/templates/csv/runtime.txt.template b/dashtools/templating/templates/csv/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/csv/runtime.txt.template
rename to dashtools/templating/templates/csv/runtime.txt.template
diff --git a/dash_tools/templating/templates/csv/src/__init__.py.template b/dashtools/templating/templates/csv/src/__init__.py.template
similarity index 100%
rename from dash_tools/templating/templates/csv/src/__init__.py.template
rename to dashtools/templating/templates/csv/src/__init__.py.template
diff --git a/dash_tools/templating/templates/csv/src/app.py.template b/dashtools/templating/templates/csv/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/csv/src/app.py.template
rename to dashtools/templating/templates/csv/src/app.py.template
diff --git a/dash_tools/templating/templates/csv/src/data/2014_apple_stock.csv.template b/dashtools/templating/templates/csv/src/data/2014_apple_stock.csv.template
similarity index 100%
rename from dash_tools/templating/templates/csv/src/data/2014_apple_stock.csv.template
rename to dashtools/templating/templates/csv/src/data/2014_apple_stock.csv.template
diff --git a/dash_tools/templating/templates/default/Procfile.template b/dashtools/templating/templates/default/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/default/Procfile.template
rename to dashtools/templating/templates/default/Procfile.template
diff --git a/dash_tools/templating/templates/default/README.md.template b/dashtools/templating/templates/default/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/default/README.md.template
rename to dashtools/templating/templates/default/README.md.template
diff --git a/dash_tools/templating/templates/default/runtime.txt.template b/dashtools/templating/templates/default/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/default/runtime.txt.template
rename to dashtools/templating/templates/default/runtime.txt.template
diff --git a/dash_tools/templating/templates/default/src/__init__.py.template b/dashtools/templating/templates/default/src/__init__.py.template
similarity index 100%
rename from dash_tools/templating/templates/default/src/__init__.py.template
rename to dashtools/templating/templates/default/src/__init__.py.template
diff --git a/dash_tools/templating/templates/default/src/app.py.template b/dashtools/templating/templates/default/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/default/src/app.py.template
rename to dashtools/templating/templates/default/src/app.py.template
diff --git a/dash_tools/templating/templates/iris/Procfile.template b/dashtools/templating/templates/fastdash/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/iris/Procfile.template
rename to dashtools/templating/templates/fastdash/Procfile.template
diff --git a/dashtools/templating/templates/fastdash/README.md.template b/dashtools/templating/templates/fastdash/README.md.template
new file mode 100644
index 0000000..e41a351
--- /dev/null
+++ b/dashtools/templating/templates/fastdash/README.md.template
@@ -0,0 +1,13 @@
+# Dash Fast-Dash Template: {appName}
+
+Created on {createTime}
+
+Welcome to your [Plotly Dash](https://plotly.com/dash/) App! This is a template for your {appName} app.
+
+See the [Dash Documentation](https://dash.plotly.com/introduction) for more information on how to get your app up and running.
+
+Check out [Fast Dash](https://fastdash.app/) for more details on this template.
+
+## Running the App
+
+Run `src/app.py` and navigate to http://127.0.0.1:8050/ in your browser.
\ No newline at end of file
diff --git a/dash_tools/templating/templates/iris/runtime.txt.template b/dashtools/templating/templates/fastdash/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/iris/runtime.txt.template
rename to dashtools/templating/templates/fastdash/runtime.txt.template
diff --git a/dash_tools/templating/templates/mantine/src/__init__.py.template b/dashtools/templating/templates/fastdash/src/__init__.py.template
similarity index 100%
rename from dash_tools/templating/templates/mantine/src/__init__.py.template
rename to dashtools/templating/templates/fastdash/src/__init__.py.template
diff --git a/dashtools/templating/templates/fastdash/src/app.py.template b/dashtools/templating/templates/fastdash/src/app.py.template
new file mode 100644
index 0000000..4cd3a20
--- /dev/null
+++ b/dashtools/templating/templates/fastdash/src/app.py.template
@@ -0,0 +1,23 @@
+'''
+ # @ Create Time: {createTime}
+'''
+
+from fast_dash import FastDash
+from fast_dash.Components import Text
+
+# Step 1: Define your model inference
+def text_to_text_function(input_text):
+    return input_text
+
+# Step 2: Specify the input and output components
+app = FastDash(callback_fn=text_to_text_function, 
+                inputs=Text, 
+                outputs=Text, 
+                title="{appName}")
+
+# Declare server for Heroku deployment. Needed for Procfile.
+server = app.app.server
+
+
+if __name__ == '__main__':
+    app.run()
diff --git a/dash_tools/templating/templates/mantine/Procfile.template b/dashtools/templating/templates/iconify/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/mantine/Procfile.template
rename to dashtools/templating/templates/iconify/Procfile.template
diff --git a/dashtools/templating/templates/iconify/README.md.template b/dashtools/templating/templates/iconify/README.md.template
new file mode 100644
index 0000000..82e270f
--- /dev/null
+++ b/dashtools/templating/templates/iconify/README.md.template
@@ -0,0 +1,13 @@
+# Dash Iconify Template: {appName}
+
+Created on {createTime}
+
+Welcome to your [Plotly Dash](https://plotly.com/dash/) App! This is a template for your {appName} app.
+
+See the [Dash Documentation](https://dash.plotly.com/introduction) for more information on how to get your app up and running.
+
+Check out [Dash Iconify](https://github.com/snehilvj/dash-iconify) for more details on this template.
+
+## Running the App
+
+Run `src/app.py` and navigate to http://127.0.0.1:8050/ in your browser.
\ No newline at end of file
diff --git a/dash_tools/templating/templates/mantine/runtime.txt.template b/dashtools/templating/templates/iconify/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/mantine/runtime.txt.template
rename to dashtools/templating/templates/iconify/runtime.txt.template
diff --git a/dashtools/templating/templates/iconify/src/__init__.py.template b/dashtools/templating/templates/iconify/src/__init__.py.template
new file mode 100644
index 0000000..0487626
--- /dev/null
+++ b/dashtools/templating/templates/iconify/src/__init__.py.template
@@ -0,0 +1,1 @@
+# Auto-generated at {createTime}
\ No newline at end of file
diff --git a/dashtools/templating/templates/iconify/src/app.py.template b/dashtools/templating/templates/iconify/src/app.py.template
new file mode 100644
index 0000000..91c6cd3
--- /dev/null
+++ b/dashtools/templating/templates/iconify/src/app.py.template
@@ -0,0 +1,23 @@
+'''
+ # @ Create Time: {createTime}
+'''
+
+from dash_iconify import DashIconify
+from dash import Dash
+
+app = Dash(__name__, title="{appName}")
+
+# Declare server for Heroku deployment. Needed for Procfile.
+server = app.server
+
+app.layout = DashIconify(
+    icon="ion:logo-github",
+    width=30,
+    height=30,
+    rotate=1,
+    flip="horizontal",
+)
+
+if __name__ == "__main__":
+    app.run_server(debug=True)
+
diff --git a/dash_tools/templating/templates/multipage/Procfile.template b/dashtools/templating/templates/iris/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/Procfile.template
rename to dashtools/templating/templates/iris/Procfile.template
diff --git a/dash_tools/templating/templates/iris/README.md.template b/dashtools/templating/templates/iris/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/iris/README.md.template
rename to dashtools/templating/templates/iris/README.md.template
diff --git a/dash_tools/templating/templates/multipage/runtime.txt.template b/dashtools/templating/templates/iris/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/runtime.txt.template
rename to dashtools/templating/templates/iris/runtime.txt.template
diff --git a/dash_tools/templating/templates/iris/src/app.py.template b/dashtools/templating/templates/iris/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/iris/src/app.py.template
rename to dashtools/templating/templates/iris/src/app.py.template
diff --git a/dash_tools/templating/templates/sidebar/Procfile.template b/dashtools/templating/templates/mantine/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/sidebar/Procfile.template
rename to dashtools/templating/templates/mantine/Procfile.template
diff --git a/dash_tools/templating/templates/mantine/README.md.template b/dashtools/templating/templates/mantine/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/mantine/README.md.template
rename to dashtools/templating/templates/mantine/README.md.template
diff --git a/dash_tools/templating/templates/sidebar/runtime.txt.template b/dashtools/templating/templates/mantine/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/sidebar/runtime.txt.template
rename to dashtools/templating/templates/mantine/runtime.txt.template
diff --git a/dashtools/templating/templates/mantine/src/__init__.py.template b/dashtools/templating/templates/mantine/src/__init__.py.template
new file mode 100644
index 0000000..0487626
--- /dev/null
+++ b/dashtools/templating/templates/mantine/src/__init__.py.template
@@ -0,0 +1,1 @@
+# Auto-generated at {createTime}
\ No newline at end of file
diff --git a/dash_tools/templating/templates/mantine/src/app.py.template b/dashtools/templating/templates/mantine/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/mantine/src/app.py.template
rename to dashtools/templating/templates/mantine/src/app.py.template
diff --git a/dash_tools/templating/templates/tabs/Procfile.template b/dashtools/templating/templates/multipage/Procfile.template
similarity index 100%
rename from dash_tools/templating/templates/tabs/Procfile.template
rename to dashtools/templating/templates/multipage/Procfile.template
diff --git a/dash_tools/templating/templates/multipage/README.md.template b/dashtools/templating/templates/multipage/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/README.md.template
rename to dashtools/templating/templates/multipage/README.md.template
diff --git a/dash_tools/templating/templates/tabs/runtime.txt.template b/dashtools/templating/templates/multipage/runtime.txt.template
similarity index 100%
rename from dash_tools/templating/templates/tabs/runtime.txt.template
rename to dashtools/templating/templates/multipage/runtime.txt.template
diff --git a/dash_tools/templating/templates/multipage/src/app.py.template b/dashtools/templating/templates/multipage/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/src/app.py.template
rename to dashtools/templating/templates/multipage/src/app.py.template
diff --git a/dash_tools/templating/templates/multipage/src/assets/logo.png.template b/dashtools/templating/templates/multipage/src/assets/logo.png.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/src/assets/logo.png.template
rename to dashtools/templating/templates/multipage/src/assets/logo.png.template
diff --git a/dash_tools/templating/templates/multipage/src/pages/about.py.template b/dashtools/templating/templates/multipage/src/pages/about.py.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/src/pages/about.py.template
rename to dashtools/templating/templates/multipage/src/pages/about.py.template
diff --git a/dash_tools/templating/templates/multipage/src/pages/home.py.template b/dashtools/templating/templates/multipage/src/pages/home.py.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/src/pages/home.py.template
rename to dashtools/templating/templates/multipage/src/pages/home.py.template
diff --git a/dash_tools/templating/templates/multipage/src/pages/not_found_404.py.template b/dashtools/templating/templates/multipage/src/pages/not_found_404.py.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/src/pages/not_found_404.py.template
rename to dashtools/templating/templates/multipage/src/pages/not_found_404.py.template
diff --git a/dash_tools/templating/templates/multipage/src/pages_plugin.py.template b/dashtools/templating/templates/multipage/src/pages_plugin.py.template
similarity index 100%
rename from dash_tools/templating/templates/multipage/src/pages_plugin.py.template
rename to dashtools/templating/templates/multipage/src/pages_plugin.py.template
diff --git a/dashtools/templating/templates/sidebar/Procfile.template b/dashtools/templating/templates/sidebar/Procfile.template
new file mode 100644
index 0000000..0f59e66
--- /dev/null
+++ b/dashtools/templating/templates/sidebar/Procfile.template
@@ -0,0 +1,1 @@
+web: gunicorn --timeout 600 --chdir src app:server
\ No newline at end of file
diff --git a/dash_tools/templating/templates/sidebar/README.md.template b/dashtools/templating/templates/sidebar/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/sidebar/README.md.template
rename to dashtools/templating/templates/sidebar/README.md.template
diff --git a/dashtools/templating/templates/sidebar/runtime.txt.template b/dashtools/templating/templates/sidebar/runtime.txt.template
new file mode 100644
index 0000000..f96c0fa
--- /dev/null
+++ b/dashtools/templating/templates/sidebar/runtime.txt.template
@@ -0,0 +1,1 @@
+python-3.8.10
\ No newline at end of file
diff --git a/dash_tools/templating/templates/sidebar/src/app.py.template b/dashtools/templating/templates/sidebar/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/sidebar/src/app.py.template
rename to dashtools/templating/templates/sidebar/src/app.py.template
diff --git a/dashtools/templating/templates/tabs/Procfile.template b/dashtools/templating/templates/tabs/Procfile.template
new file mode 100644
index 0000000..0f59e66
--- /dev/null
+++ b/dashtools/templating/templates/tabs/Procfile.template
@@ -0,0 +1,1 @@
+web: gunicorn --timeout 600 --chdir src app:server
\ No newline at end of file
diff --git a/dash_tools/templating/templates/tabs/README.md.template b/dashtools/templating/templates/tabs/README.md.template
similarity index 100%
rename from dash_tools/templating/templates/tabs/README.md.template
rename to dashtools/templating/templates/tabs/README.md.template
diff --git a/dashtools/templating/templates/tabs/runtime.txt.template b/dashtools/templating/templates/tabs/runtime.txt.template
new file mode 100644
index 0000000..f96c0fa
--- /dev/null
+++ b/dashtools/templating/templates/tabs/runtime.txt.template
@@ -0,0 +1,1 @@
+python-3.8.10
\ No newline at end of file
diff --git a/dash_tools/templating/templates/tabs/src/app.py.template b/dashtools/templating/templates/tabs/src/app.py.template
similarity index 100%
rename from dash_tools/templating/templates/tabs/src/app.py.template
rename to dashtools/templating/templates/tabs/src/app.py.template
diff --git a/dashtools/version.py b/dashtools/version.py
new file mode 100644
index 0000000..0f66308
--- /dev/null
+++ b/dashtools/version.py
@@ -0,0 +1,1 @@
+__version__ = '1.4'
diff --git a/deploy-app.gif b/deploy-app.gif
new file mode 100644
index 0000000..5dde207
Binary files /dev/null and b/deploy-app.gif differ
diff --git a/docs/fastdash_template.png b/docs/fastdash_template.png
new file mode 100644
index 0000000..0a9bb40
Binary files /dev/null and b/docs/fastdash_template.png differ
diff --git a/docs/logo.png b/docs/logo.png
new file mode 100644
index 0000000..ec10765
Binary files /dev/null and b/docs/logo.png differ
diff --git a/requirements.txt b/requirements.txt
index 053f287..0ba8bfd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,4 +10,6 @@ pipreqs
 pre-commit
 pytest
 pandas
-dash-mantine-components
\ No newline at end of file
+dash-mantine-components
+fast-dash
+dash-iconify
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 90ff5a7..0d7c2fc 100644
--- a/setup.py
+++ b/setup.py
@@ -6,7 +6,7 @@
 
 meta = {}
 
-with open('./dash_tools/version.py') as f:
+with open('./dashtools/version.py') as f:
     exec(f.read(), meta)
 
 with open('requirements.txt') as f:
@@ -19,10 +19,7 @@
     author_email="andrew_hossack@outlook.com",
     description="Plotly Dash Templating and Deployment Tools",
     entry_points={
-        'console_scripts': [
-                'dash-tools = dash_tools.cli.cli:main'
-        ]
-    },
+        'console_scripts': ['dashtools = dashtools.cli.cli:main']},
     long_description=long_description,
     long_description_content_type="text/markdown",
     url="https://github.com/andrew-hossack/dash-tools",


Test patch:
diff --git a/tests/test_build_templates.py b/tests/test_build_templates.py
index 4ac5195..d749f59 100644
--- a/tests/test_build_templates.py
+++ b/tests/test_build_templates.py
@@ -3,7 +3,7 @@
  # @ Create Time: 2022-04-28 23:09:06
 '''
 import unittest
-from dash_tools.templating import buildTemplate, templateUtils
+from dashtools.templating import buildApp, buildAppUtils
 
 
 class BuildTemplatesTest(unittest.TestCase):
diff --git a/tests/test_cli.py b/tests/test_cli.py
index 2855bdf..be678ca 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -5,49 +5,52 @@
 import unittest
 from unittest.mock import MagicMock
 
-from dash_tools.cli import cli
-from dash_tools.deploy import deployHeroku
-from dash_tools.templating import buildTemplate, templateUtils
+from dashtools.cli import cli
+from dashtools.deploy import deployHeroku
+from dashtools.templating import buildApp, buildAppUtils
 
 
 class CLITest(unittest.TestCase):
+    """
+    TODO Need to update for new CLI
+    """
 
-    def test_handle_args_deploy_heroku(self):
-        args = MagicMock()
-        args.init = None
-        args.templates = False
-        args.deploy_heroku = 'test'
-        args.parse_args = MagicMock(return_value=args)
-        deployHeroku.deploy_app_to_heroku = MagicMock()
-        cli.handle_args(args)
-        assert deployHeroku.deploy_app_to_heroku.called
+    # def test_main_deploy_heroku(self):
+    #     args = MagicMock()
+    #     args.init = None
+    #     args.templates = False
+    #     args.deploy_heroku = 'test'
+    #     args.parse_args = MagicMock(return_value=args)
+    #     deployHeroku.deploy_app_to_heroku = MagicMock()
+    #     cli.main(args)
+    #     assert deployHeroku.deploy_app_to_heroku.called
 
-    def test_handle_args_init(self):
-        args = MagicMock()
-        args.init = ['test']
-        args.templates = False
-        args.deploy_heroku = None
-        args.parse_args = MagicMock(return_value=args)
-        buildTemplate.create_app = MagicMock()
-        cli.handle_args(args)
-        assert buildTemplate.create_app.called
+    # def test_main_init(self):
+    #     args = MagicMock()
+    #     args.init = ['test']
+    #     args.templates = False
+    #     args.deploy_heroku = None
+    #     args.parse_args = MagicMock(return_value=args)
+    #     buildApp.create_app = MagicMock()
+    #     cli.main(args)
+    #     assert buildApp.create_app.called
 
-    def test_handle_args_templates(self):
-        args = MagicMock()
-        args.init = None
-        args.templates = True
-        args.deploy_heroku = None
-        args.parse_args = MagicMock(return_value=args)
-        templateUtils.print_templates = MagicMock()
-        cli.handle_args(args)
-        assert templateUtils.print_templates.called
+    # def test_main_templates(self):
+    #     args = MagicMock()
+    #     args.init = None
+    #     args.templates = True
+    #     args.deploy_heroku = None
+    #     args.parse_args = MagicMock(return_value=args)
+    #     buildAppUtils.print_templates = MagicMock()
+    #     cli.main(args)
+    #     assert buildAppUtils.print_templates.called
 
-    def test_print_help(self):
-        args = MagicMock()
-        args.init = None
-        args.templates = False
-        args.deploy_heroku = None
-        args.parse_args = MagicMock(return_value=args)
-        args.print_help = MagicMock()
-        with self.assertRaises(SystemExit):
-            cli.handle_args(args)
+    # def test_print_help(self):
+    #     args = MagicMock()
+    #     args.init = None
+    #     args.templates = False
+    #     args.deploy_heroku = None
+    #     args.parse_args = MagicMock(return_value=args)
+    #     args.print_help = MagicMock()
+    #     with self.assertRaises(SystemExit):
+    #         cli.main(args)
diff --git a/tests/test_herokuUtils.py b/tests/test_herokuUtils.py
index 91cb3e8..8e3bc73 100644
--- a/tests/test_herokuUtils.py
+++ b/tests/test_herokuUtils.py
@@ -3,7 +3,7 @@
  # @ Create Time: 2022-04-28 22:09:23
 '''
 import unittest
-from dash_tools.deploy import herokuUtils
+from dashtools.deploy import herokuUtils
 
 
 class HerokuUtilsTest(unittest.TestCase):
diff --git a/tests/test_templates.py b/tests/test_templates.py
index 599519d..64af510 100644
--- a/tests/test_templates.py
+++ b/tests/test_templates.py
@@ -4,8 +4,8 @@
 '''
 import argparse
 import unittest
-from dash_tools.templating import Templates
-from dash_tools.templating.templateUtils import convert_to_template_or_error, get_template_from_args
+from dashtools.templating import Templates
+from dashtools.templating.buildAppUtils import _convert_to_template_or_error, get_template_from_args
 
 
 class TemplatesTest(unittest.TestCase):
@@ -21,12 +21,12 @@ def test_print_templates(self):
 
     def test_convert_to_template_or_error(self):
         # test valid template
-        template = convert_to_template_or_error('default')
+        template = _convert_to_template_or_error('default')
         assert template == Templates.Template.DEFAULT
 
         # test invalid template
         with self.assertRaises(SystemExit):
-            convert_to_template_or_error('invalid')
+            _convert_to_template_or_error('invalid')
 
     def test_get_template_from_args(self):
         # test no template passed
@@ -37,4 +37,4 @@ def test_get_template_from_args(self):
         # test template passed
         args = argparse.Namespace(init=['init', 'tabs'])
         template = get_template_from_args(args)
-        assert template == 'tabs'
+        assert template == Templates.Template.TABS