diff --git a/internal/configs/config_dracut.go b/internal/configs/config_dracut.go
index 0a87da5..8330031 100644
--- a/internal/configs/config_dracut.go
+++ b/internal/configs/config_dracut.go
@@ -29,4 +29,7 @@ func Set_Dracut() {
 
 	// Add to our kernel arguments file that vfio_pci should load early (dracut does this using kernel arguments)
 	fileio.AppendContent(" rd.driver.pre=vfio_pci", config.Path.CMDLINE)
+
+	// Make a backup of dracutConf if there is one there
+	backupFile(strings.Replace(dracutConf, "config", "", 1))
 }
diff --git a/internal/configs/config_modprobe.go b/internal/configs/config_modprobe.go
index ba8cc3e..227cd61 100644
--- a/internal/configs/config_modprobe.go
+++ b/internal/configs/config_modprobe.go
@@ -60,4 +60,7 @@ func Set_Modprobe(gpu_IDs []string) {
 		content,
 		conffile,
 	)
+
+	// Make a backup of dracutConf if there is one there
+	backupFile(strings.Replace(conffile, "config", "", 1))
 }
diff --git a/internal/configs/configs.go b/internal/configs/configs.go
index 1602ede..dc0096f 100644
--- a/internal/configs/configs.go
+++ b/internal/configs/configs.go
@@ -95,6 +95,9 @@ func InitConfigs() {
 				confpath,
 			)
 
+			// Make a backup directory
+			makeBackupDir(syspath)
+
 			// Create the directories for our configs
 			err := os.MkdirAll(confpath, os.ModePerm)
 			errorcheck.ErrorCheck(err)
@@ -128,6 +131,9 @@ func InitConfigs() {
 			errorcheck.ErrorCheck(err)
 			// Close the file so we can edit it
 			file.Close()
+
+			// Backup the sysfile if we do not have a backup
+			backupFile(sysfile)
 		}
 
 		// If we now have a config that exists
@@ -179,3 +185,36 @@ func vfio_modules() []string {
 	// Return the modules
 	return modules
 }
+
+func backupFile(source string) {
+	// Make a destination path
+	dest := fmt.Sprintf("backup%s", source)
+
+	// If the file exists in the config but not on the system it is a file we make
+	if fileio.FileExist(fmt.Sprintf("config%s", source)) && !fileio.FileExist(source) {
+		// Create the blank file so that a copy of the backup folder to /etc
+		file, err := os.Create(dest)
+		errorcheck.ErrorCheck(err, "Error creating file %s", dest)
+		file.Close()
+	} else if !fileio.FileExist(dest) {
+		// If a backup of the file does not exist
+		// Write to the logger
+		logger.Printf("No first time backup of %s detected.\nCreating a backup at %s", source, dest)
+
+		// Copy the file
+		fileio.FileCopy(source, dest)
+	}
+
+}
+
+func makeBackupDir(dest string) {
+	// If a backup directory does not exist
+	if !fileio.FileExist("backup/") {
+		// Write to the logger
+		logger.Printf("Backup directory does not exist!\nCreating backup directory for first run backup")
+	}
+
+	// Make the empty directories
+	err := os.MkdirAll(fmt.Sprintf("backup/%s", dest), os.ModePerm)
+	errorcheck.ErrorCheck(err, "Error making backup/ folder")
+}
diff --git a/internal/ui_main_events.go b/internal/ui_main_events.go
index 7de865f..83a3758 100644
--- a/internal/ui_main_events.go
+++ b/internal/ui_main_events.go
@@ -27,9 +27,6 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 				if m.focused > 0 && m.focused != DONE {
 					m.focused--
 					return m, nil
-				} else if m.focused == DONE {
-					// Since we have no QuickEmu support, skip the usb controller configuration
-					m.focused = VIDEO
 				} else {
 					// If we are at the beginning, just exit
 					return m, tea.Quit
@@ -39,6 +36,10 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			// If we are done then handle keybindings a bit differently
 			// Setup keybindings for authDialog
 			switch msg.String() {
+			case "ctrl+z":
+				// Since we have no QuickEmu support, skip the usb controller configuration
+				m.focused = VIDEO
+
 			case "ctrl+c":
 				// Exit when user presses CTRL+C
 				return m, tea.Quit
diff --git a/internal/ui_main_view.go b/internal/ui_main_view.go
index 7d0651e..d0b448f 100644
--- a/internal/ui_main_view.go
+++ b/internal/ui_main_view.go
@@ -125,9 +125,14 @@ func (m model) View() string {
 					"* The \"quickemu\" folder contains files that might be\n  useable for quickemu in the future\n",
 					"* The files inside the \"etc\" folder must be copied to your system.\n",
 					"  NOTE: Verify that these files are correctly formated/edited!\n",
+					"* Once all files have been copied, you need to update your bootloader and rebuild\n",
+					"  your initramfs using the tools to do so by your system.\n",
 					"\n",
-					"A script file named \"install.sh\" has been generated,\n",
-					"run it to copy the files to your system and make a backup of your old files.",
+					"This program can do this for you, however the program will have to\n",
+					"type your password to sudo using STDIN, to avoid using STDIN press CTRL+C\n",
+					"and copy the files, update your bootloader and rebuild your initramfs manually.\n",
+					"If you want to go back and change something, press CTRL+Z\n",
+					"\nNOTE: A backup of the original files from the first run can be found in the backup folder",
 				),
 			)
 
diff --git a/pkg/fileio/fileio.go b/pkg/fileio/fileio.go
index 959394e..38c5a7a 100644
--- a/pkg/fileio/fileio.go
+++ b/pkg/fileio/fileio.go
@@ -4,13 +4,17 @@ import (
 	"bufio"
 	"errors"
 	"fmt"
+	"io"
 	"os"
 
 	"github.com/HikariKnight/ls-iommu/pkg/errorcheck"
 )
 
-// This just implements repetetive tasks I have to do with files
+/*
+ * This just implements repetetive tasks I have to do with files
+ */
 
+// Creates a file and appends the content to the file (ending newline must be supplied with content string)
 func AppendContent(content string, fileName string) {
 	// Open the file
 	f, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm)
@@ -22,6 +26,7 @@ func AppendContent(content string, fileName string) {
 	errorcheck.ErrorCheck(err, fmt.Sprintf("Error writing to %s", fileName))
 }
 
+// Reads the file and returns a stringlist with each line
 func ReadLines(fileName string) []string {
 	content, err := os.Open(fileName)
 	errorcheck.ErrorCheck(err, fmt.Sprintf("Error reading file %s", fileName))
@@ -41,6 +46,7 @@ func ReadLines(fileName string) []string {
 
 }
 
+// Reads a file and returns all the content as a string
 func ReadFile(fileName string) string {
 	// Read the whole file
 	content, err := os.ReadFile(fileName)
@@ -51,6 +57,7 @@ func ReadFile(fileName string) string {
 
 }
 
+// Checks if a file exists and returns a bool
 func FileExist(fileName string) bool {
 	var exist bool
 
@@ -66,3 +73,27 @@ func FileExist(fileName string) bool {
 	// Return if the file exists
 	return exist
 }
+
+// Copies a FILE from source to dest
+func FileCopy(sourceFile, destFile string) {
+	// Get the file info
+	filestat, err := os.Stat(sourceFile)
+	errorcheck.ErrorCheck(err, "Error getting fileinfo of: %s", sourceFile)
+
+	// If the file is a regular file
+	if filestat.Mode().IsRegular() {
+		// Open the source file for reading
+		source, err := os.Open(sourceFile)
+		errorcheck.ErrorCheck(err, "Error opening %s for copying", sourceFile)
+		defer source.Close()
+
+		// Create the destination file
+		dest, err := os.Create(destFile)
+		errorcheck.ErrorCheck(err, "Error creating %s", destFile)
+		defer dest.Close()
+
+		// Copy the contents of source to dest using io
+		_, err = io.Copy(dest, source)
+		errorcheck.ErrorCheck(err, "Failed to copy \"%s\" to \"%s\"", sourceFile, destFile)
+	}
+}