diff --git a/Nasal/aircraft.nas b/Nasal/aircraft.nas
index 8494b35e5..dd66b79ca 100644
--- a/Nasal/aircraft.nas
+++ b/Nasal/aircraft.nas
@@ -571,6 +571,53 @@ var livery_update = {
 };
 
 
+
+# res2str
+# =============================================================================
+# Helper function for canvas_livery
+# Returns the Nk version for the given resolution
+var res2str = func(resolution) {
+	if (resolution == 1024) {
+		return "1k";
+	}
+	if (resolution == 2048) {
+		return "2k";
+	}
+	if (resolution == 4096) {
+		return "4k";
+	}
+	if (resolution == 8192) {
+		return "8k";
+	}
+	if (resolution == 16384) {
+		return "16k";
+	}
+	return nil;
+};
+
+
+
+# findTexByRes 
+# =============================================================================
+# Helper function for canvas_livery
+# Looks for the largest available livery texture in resolution equal or smaller
+# than the given limit
+var findTexByRes = func(path, file, maxRes) {
+	res = maxRes;
+# TODO fix
+# os.path: file operation on 'Path "Aircraft/A320-family/Models/Liveries/A320/CFM/4k/SWR-fuselage.png"' access denied (relative paths not accepted; use realpath() to make a path absolute)
+	checkFile = os.path.new(path);
+	while (res >= 1024) {
+		checkFile.set(path ~ "/" ~ res2str(res) ~ "/" ~ file);
+		if (checkFile.isFile()) {
+			return res2str(res);
+		}
+		res = res / 2;
+	}
+};
+
+
+
 # canvas_livery
 # =============================================================================
 # Class for Canvas based liveries
@@ -580,6 +627,7 @@ var canvas_livery = {
 		var m = { parents: [canvas_livery, overlay_update.new()] };
 		m.parents[1].add(liveriesdir, "sim/model/livery/file", callback);
 		m.parents[1].interval = interval;
+		m.liveriesdir = liveriesdir;
 		m.resolution = resolution;
 		m.targets = {};
 		m.targetsByProperty = {};
@@ -598,6 +646,11 @@ var canvas_livery = {
 			listener: nil,
 			resolution: resolution,
 		};
+		maxRes = getprop("/sim/model/livery/max-resolution");
+		# Make sure we never load too large textures
+		if (resolution > maxRes) {
+			resolution = maxRes;
+		}
 		me.targets[name].canvas = canvas.new({
 			"name": name,
 			"size": [resolution, resolution],
@@ -608,11 +661,11 @@ var canvas_livery = {
 			me.targets[name].canvas.addPlacement({"node": object});
 		}
 		me.targets[name].groups["base"] = me.targets[name].canvas.createGroup("base");
-		me.targets[name].layers["base"] = me.targets[name].groups["base"].createChild("image").setFile(getprop(property)).setSize(resolution,resolution);
+		me.targets[name].layers["base"] = me.targets[name].groups["base"].createChild("image").setFile(me.liveriesdir ~ "/" ~ findTexByRes(me.liveriesdir, getprop(property), resolution) ~ "/" ~ getprop(property)).setSize(resolution,resolution);
 		me.targetsByProperty[property] = name;
 		me.targets[name].listener = setlistener(property, func(property) {
 			me.targets[name].groups["base"].removeAllChildren();
-			me.targets[name].layers["base"] = me.targets[name].groups["base"].createChild("image").setFile(property.getValue()).setSize(resolution,resolution);
+			me.targets[name].layers["base"] = me.targets[name].groups["base"].createChild("image").setFile(me.liveriesdir ~ "/" ~ findTexByRes(me.liveriesdir, getprop(property), resolution) ~ "/" ~ getprop(property)).setSize(resolution,resolution);
 		});
 	},
 	addLayer: func(target, name, file) {
diff --git a/defaults.xml b/defaults.xml
index 245769350..953ed5963 100644
--- a/defaults.xml
+++ b/defaults.xml
@@ -972,6 +972,11 @@ Started September 2000 by David Megginson, david@megginson.com
       <adress type="string" userarchive="y">127.0.0.1</adress>
       <port type="int" userarchive="y">45003</port>
     </swift>
+    <model>
+      <livery>
+        <max-resolution type="int" userarchive="y">4096</max-resolution>
+      </livery>
+    </model>
   </sim>
   <!-- accelerations -->
   <accelerations>