diff --git a/roles/deploy-xorg/files/scripts/nvidia-xconf-gen.py b/roles/deploy-xorg/files/scripts/nvidia-xconf-gen.py
new file mode 100755
index 0000000000000000000000000000000000000000..f26446971f04c022e19897edf5d9d05cefe61da7
--- /dev/null
+++ b/roles/deploy-xorg/files/scripts/nvidia-xconf-gen.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+from jinja2 import Template
+import itertools
+import subprocess
+import datetime
+import os
+import sys
+import time
+import socket
+from subprocess import call
+import re
+import json
+
+def grab_card_ids():
+	# This method runs nvidia-smi to grab the card ids, then returns a list
+    
+    if not os.path.isfile("/bin/nvidia-smi"):
+    	print("nvidia-smi binary not found!")
+    	exit(1)
+
+    cmd = ["/bin/nvidia-smi", "--query-gpu=pci.bus_id","--format=csv,noheader"]
+    p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+    
+    cards = []
+
+    for line in p.stdout.readlines():
+        line = line.rstrip().split(":")[2]
+        pcibus_num = int(re.sub('[.:]', '', line).rstrip("0"),16)
+        card = "PCI:0:{}:0".format(str(pcibus_num))
+    	cards.append(card)
+    return cards
+
+def grab_card_boardname():
+	if not os.path.isfile("/bin/nvidia-smi"):
+	 	print("nvidia-smi binary not found!")
+	 	exit(1)
+
+	cmd = ["/bin/nvidia-smi", "--query-gpu=name","--format=csv,noheader"]
+	cards = []
+	p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+	for line in p.stdout.readlines():
+		line = line.rstrip()
+		cards.append(line)
+	return cards
+
+def write_xorg_conf(cards):
+	num_of_cards = len(cards) + 1
+	boardname = (grab_card_boardname())[0]
+	gpus = []
+
+	for i in range(1, num_of_cards):
+		monitors = []
+		screens = []
+		res = list(itertools.combinations(cards,i))
+
+		for j in range(i):
+			monitors.append("Monitor"+str(j))
+			screens.append("Screen"+str(j))
+
+		for card in res:
+			filename = "/etc/X11/xorg.conf." + str(i) + str(res.index(card))
+			#gpus[filename] = filename
+			
+			gpus.append({'filename':filename,'boardname':boardname,'monitors':monitors,'screens':screens,'devices':card})
+
+
+	print(json.dumps(gpus))
+
+if __name__ == "__main__":
+
+#	cards = grab_card_ids()
+#	write_xorg_conf(cards)
+	cards = grab_card_ids()
+	write_xorg_conf(cards)
+
+
+''' with open("xorgconftest.j2") as f:
+	template =  Template(f.read())
+
+num_of_monitors = 2
+
+monitors = []
+screens = []
+busid = ["PCI:0:6:0","PCI:0:7:0","PCI:0:8:0","PCI:0:9:0"]
+
+for i in range(num_of_monitors):
+	monitors.append("Monitor" + str(i))
+	screens.append("Screen" + str(i))
+
+#output = template.render(monitors=monitors,devices=busid)
+#print(output)
+
+res = itertools.combinations(busid,2)
+listres = list(res)
+
+for i in listres:
+	output = template.render(monitors=monitors,devices=i,screens=screens)
+	filename = "xorg.conf." + str(listres.index(i))
+	print(filename)
+	f = open(filename,"w")
+	f.write(output)
+	f.close() '''
diff --git a/roles/deploy-xorg/tasks/main.yml b/roles/deploy-xorg/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..32afb6d4c07a79ebc436c4559fa1d3fcf87cf581
--- /dev/null
+++ b/roles/deploy-xorg/tasks/main.yml
@@ -0,0 +1,16 @@
+---
+- name: run nvidia-xconf-gen
+  script: scripts/nvidia-xconf-gen.py
+  register: nvidiacards
+  check_mode: no
+
+- name: set env for nvidia_card_lists
+  set_fact: 
+    nvidiacardslist: "{{ nvidiacards.stdout | from_json }}"
+
+- name: generate nvidia-xorg-conf
+  sudo: true
+  template:
+    src: xorg.conf.j2
+    dest: "{{ item['filename'] }}"
+  with_items: "{{ nvidiacardslist }}"
diff --git a/roles/deploy-xorg/templates/blacklist-nouveau.conf.j2 b/roles/deploy-xorg/templates/blacklist-nouveau.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..96993361f370408d6cb1e6fe227b69e63e0f4cab
--- /dev/null
+++ b/roles/deploy-xorg/templates/blacklist-nouveau.conf.j2
@@ -0,0 +1,3 @@
+blacklist nouveau
+options nouveau modeset=0
+
diff --git a/roles/deploy-xorg/templates/grub.conf.j2 b/roles/deploy-xorg/templates/grub.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..26b822130ddcf46ec8b43965e41ea02ab3352d2d
--- /dev/null
+++ b/roles/deploy-xorg/templates/grub.conf.j2
@@ -0,0 +1,17 @@
+# grub.conf generated by anaconda
+#
+# Note that you do not have to rerun grub after making changes to this file
+# NOTICE:  You do not have a /boot partition.  This means that
+#          all kernel and initrd paths are relative to /, eg.
+#          root (hd0,0)
+#          kernel /boot/vmlinuz-version ro root=/dev/vda1
+#          initrd /boot/initrd-[generic-]version.img
+#boot=/dev/vda
+default=0
+timeout=5
+splashimage=(hd0,0)/boot/grub/splash.xpm.gz
+hiddenmenu
+title CentOS (2.6.32-504.el6.x86_64)
+	root (hd0,0)
+	kernel /boot/vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/vda1 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto elevator=noop biosdevname=0 console=ttyS0 rdblacklist=nouveau nouveau.modeset=0 rd_NO_LVM rd_NO_DM rhgb quiet 
+	initrd /boot/initramfs-2.6.32-504.el6.x86_64.img
diff --git a/roles/deploy-xorg/templates/nvidia-persistenced.service b/roles/deploy-xorg/templates/nvidia-persistenced.service
new file mode 100644
index 0000000000000000000000000000000000000000..b4918a3debcbe7052a8b35e81a70531f3edfcfff
--- /dev/null
+++ b/roles/deploy-xorg/templates/nvidia-persistenced.service
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2013 NVIDIA Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+#
+# This is a sample systemd service file, designed to show how the NVIDIA
+# Persistence Daemon can be started.
+#
+
+[Unit]
+Description=NVIDIA Persistence Daemon
+Wants=syslog.target
+
+[Service]
+Type=forking
+ExecStart=/usr/bin/nvidia-persistenced --persistence-mode --user nvidia-persistenced
+ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/deploy-xorg/templates/nvidia.conf.j2 b/roles/deploy-xorg/templates/nvidia.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..d5c81c1f576c20be851dc2061c395f11238aad27
--- /dev/null
+++ b/roles/deploy-xorg/templates/nvidia.conf.j2
@@ -0,0 +1,2 @@
+options nvidia NVreg_DeviceFileMode=0666
+
diff --git a/roles/deploy-xorg/templates/xorg.conf.j2 b/roles/deploy-xorg/templates/xorg.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..2fc5f043c03e710be306d3b740cb6f5963216860
--- /dev/null
+++ b/roles/deploy-xorg/templates/xorg.conf.j2
@@ -0,0 +1,78 @@
+# nvidia-xconfig: X configuration file generated by nvidia-xconfig
+# nvidia-xconfig:  version 375.66  (buildmeister@swio-display-x86-rhel47-06)  Mon May  1 15:45:32 PDT 2017
+Section "DRI"
+    Mode 0666
+EndSection
+
+Section "ServerLayout"
+
+    #InputDevice    "Keyboard0" "CoreKeyboard"
+    #InputDevice    "Mouse0" "CorePointer"
+    Identifier      "Layout0"
+    {% for screen in item.screens %}
+    {% if item.screens.index(screen) == 0 %}
+    Screen 0        "Screen{{item.screens.index(screen)}}"
+    {% else %}
+    Screen {{item.screens.index(screen)}}        "Screen{{item.screens.index(screen)}}" RightOf "Screen{{item.screens.index(screen)-1}}"
+    {% endif %}
+    {% endfor %}
+    #InputDevice    "Keyboard0" "CoreKeyboard"
+    #InputDevice    "Mouse0" "CorePointer"
+EndSection
+
+Section "Files"
+    FontPath        "/usr/share/fonts/default/Type1"
+EndSection
+
+Section "InputDevice"
+
+    # generated from default
+    Identifier     "Mouse0"
+    Driver         "mouse"
+    Option         "Protocol" "auto"
+    Option         "Device" "/dev/input/mice"
+    Option         "Emulate3Buttons" "no"
+    Option         "ZAxisMapping" "4 5"
+EndSection
+
+Section "InputDevice"
+
+    # generated from default
+    Identifier     "Keyboard0"
+    Driver         "kbd"
+EndSection
+{% for monitor in item.monitors %}
+Section "Monitor"
+    Identifier     "{{monitor}}"
+    VendorName     "Unknown"
+    ModelName      "Unknown"
+    HorizSync       28.0 - 33.0
+    VertRefresh     43.0 - 72.0
+    Option         "DPMS"
+EndSection
+{% endfor %}
+{% for device in item.devices %}
+Section "Device"
+    Identifier     "Device{{item.devices.index(device)}}"
+    Driver         "nvidia"
+    VendorName     "NVIDIA Corporation"
+    boardname      "{{item.boardname}}"
+    BusID          "{{device}}"
+EndSection
+{% endfor %}
+{% for screen in item.screens %}
+Section "Screen"
+    Identifier     "Screen{{item.screens.index(screen)}}"
+    Device         "Device{{item.screens.index(screen)}}"
+    Monitor        "Monitor{{item.screens.index(screen)}}"
+    DefaultDepth    24
+    Option         "UseDisplayDevice" "None"
+    Option         "ProbeAllGpus" "false"
+    SubSection     "Display"
+        Virtual     1920 1200
+        Depth       24
+    EndSubSection
+EndSection
+{% endfor -%}
+
+
diff --git a/roles/deploy-xorg/templates/xserver.j2 b/roles/deploy-xorg/templates/xserver.j2
new file mode 100644
index 0000000000000000000000000000000000000000..737d03ba940650104a96e56b861bdaf255c517f4
--- /dev/null
+++ b/roles/deploy-xorg/templates/xserver.j2
@@ -0,0 +1,5 @@
+#%PAM-1.0
+auth       sufficient	pam_rootok.so
+auth sufficient pam_permit.so
+account    required	pam_permit.so
+session    optional	pam_keyinit.so force revoke