Repository: aws-cloudformation/cfn-lint

Issue:
Prefer Fn::Sub over Fn::Join for simple substitution
*cfn-lint version: (`cfn-lint --version`)* 0.20.1

*Description of issue.*

`!Sub` is generally more readable than `!Join` for simple substitution. A common design pattern is to use `!Join` with an empty string delimiter `''`. `!Sub` can accomplish this same function but is often easier to read which aids others in interpreting a template. There are other cases but empty string is the most obvious.



Discussion:
I totally agree with you about Sub vs Join, but this proposed rule would be quite opinionated.  Maybe put it at INFO level, or make it opt-in?
Agreed, this would be info level.

Resolving patch:
diff --git a/src/cfnlint/rules/functions/SubNotJoin.py b/src/cfnlint/rules/functions/SubNotJoin.py
new file mode 100644
--- /dev/null
+++ b/src/cfnlint/rules/functions/SubNotJoin.py
@@ -0,0 +1,44 @@
+"""
+  Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+
+  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.
+
+  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.
+"""
+import six
+from cfnlint import CloudFormationLintRule
+from cfnlint import RuleMatch
+
+
+class SubNotJoin(CloudFormationLintRule):
+    """Check if Join is being used with no join characters"""
+    id = 'I1022'
+    shortdesc = 'Use Sub instead of Join'
+    description = 'Prefer a sub instead of Join when using a join delimiter that is empty'
+    source_url = 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html'
+    tags = ['functions', 'sub', 'join']
+
+    def match(self, cfn):
+        """Check CloudFormation """
+
+        matches = []
+
+        join_objs = cfn.search_deep_keys('Fn::Join')
+
+        for join_obj in join_objs:
+            if isinstance(join_obj[-1], list):
+                join_operator = join_obj[-1][0]
+                if isinstance(join_operator, six.string_types):
+                    if join_operator == '':
+                        matches.append(RuleMatch(
+                            join_obj[0:-1], 'Prefer using Fn::Sub over Fn::Join with an empty delimiter'))
+        return matches


Test patch:
diff --git a/test/fixtures/results/public/watchmaker.json b/test/fixtures/results/public/watchmaker.json
new file mode 100644
--- /dev/null
+++ b/test/fixtures/results/public/watchmaker.json
@@ -0,0 +1,1339 @@
+[
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 647
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "cw-agent-install",
+                "commands",
+                "01-get-cloudwatch-agent",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 647
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 662
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "cw-agent-install",
+                "commands",
+                "02-extract-cloudwatch-agent",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 662
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 673
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "cw-agent-install",
+                "commands",
+                "10-install-cloudwatch-agent",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 673
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 689
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "cw-agent-install",
+                "files",
+                "/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 689
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 803
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "finalize",
+                "commands",
+                "10-signal-success",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 803
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 816
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "finalize",
+                "commands",
+                "10-signal-success",
+                "command",
+                "Fn::Join",
+                1,
+                4,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 816
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 833
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "finalize",
+                "commands",
+                "10-signal-success",
+                "command",
+                "Fn::Join",
+                1,
+                5,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 833
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 869
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "make-app",
+                "commands",
+                "05-get-appscript",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 869
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 887
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "make-app",
+                "commands",
+                "10-make-app",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 887
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 914
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "setup",
+                "files",
+                "/etc/cfn/cfn-hup.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 914
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 932
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "setup",
+                "files",
+                "/etc/cfn/cfn-hup.conf",
+                "content",
+                "Fn::Join",
+                1,
+                7,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 932
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 950
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "setup",
+                "files",
+                "/etc/cfn/cfn-hup.conf",
+                "content",
+                "Fn::Join",
+                1,
+                8,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 950
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 977
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "setup",
+                "files",
+                "/etc/cfn/hooks.d/cfn-auto-reloader.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 977
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 993
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "setup",
+                "files",
+                "/etc/cfn/hooks.d/cfn-auto-reloader.conf",
+                "content",
+                "Fn::Join",
+                1,
+                7,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 993
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1010
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "setup",
+                "files",
+                "/etc/cfn/hooks.d/cfn-auto-reloader.conf",
+                "content",
+                "Fn::Join",
+                1,
+                8,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1010
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 1038
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "setup",
+                "files",
+                "/etc/cfn/scripts/watchmaker-install.sh",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 1038
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 1091
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-launch",
+                "commands",
+                "10-watchmaker-launch",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 1091
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1101
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-launch",
+                "commands",
+                "10-watchmaker-launch",
+                "command",
+                "Fn::Join",
+                1,
+                3,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1101
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1119
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-launch",
+                "commands",
+                "10-watchmaker-launch",
+                "command",
+                "Fn::Join",
+                1,
+                4,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1119
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1137
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-launch",
+                "commands",
+                "10-watchmaker-launch",
+                "command",
+                "Fn::Join",
+                1,
+                5,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1137
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1155
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-launch",
+                "commands",
+                "10-watchmaker-launch",
+                "command",
+                "Fn::Join",
+                1,
+                6,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1155
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1173
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-launch",
+                "commands",
+                "10-watchmaker-launch",
+                "command",
+                "Fn::Join",
+                1,
+                7,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1173
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1191
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-launch",
+                "commands",
+                "10-watchmaker-launch",
+                "command",
+                "Fn::Join",
+                1,
+                8,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1191
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 47,
+                "LineNumber": 1215
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-update",
+                "commands",
+                "10-watchmaker-update",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 37,
+                "LineNumber": 1215
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1226
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-update",
+                "commands",
+                "10-watchmaker-update",
+                "command",
+                "Fn::Join",
+                1,
+                4,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1226
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1244
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-update",
+                "commands",
+                "10-watchmaker-update",
+                "command",
+                "Fn::Join",
+                1,
+                5,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1244
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1262
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-update",
+                "commands",
+                "10-watchmaker-update",
+                "command",
+                "Fn::Join",
+                1,
+                6,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1262
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1280
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-update",
+                "commands",
+                "10-watchmaker-update",
+                "command",
+                "Fn::Join",
+                1,
+                7,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1280
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1298
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-update",
+                "commands",
+                "10-watchmaker-update",
+                "command",
+                "Fn::Join",
+                1,
+                8,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1298
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 67,
+                "LineNumber": 1316
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "watchmaker-update",
+                "commands",
+                "10-watchmaker-update",
+                "command",
+                "Fn::Join",
+                1,
+                9,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 57,
+                "LineNumber": 1316
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 39,
+                "LineNumber": 1345
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "BlockDeviceMappings",
+                0,
+                "DeviceName",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 29,
+                "LineNumber": 1345
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 39,
+                "LineNumber": 1440
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "Tags",
+                0,
+                "Value",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 29,
+                "LineNumber": 1440
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 35,
+                "LineNumber": 1453
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 25,
+                "LineNumber": 1453
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 55,
+                "LineNumber": 1470
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join",
+                1,
+                10,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 45,
+                "LineNumber": 1470
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 55,
+                "LineNumber": 1596
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join",
+                1,
+                88,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 45,
+                "LineNumber": 1596
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 55,
+                "LineNumber": 1613
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join",
+                1,
+                89,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 45,
+                "LineNumber": 1613
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 55,
+                "LineNumber": 1642
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join",
+                1,
+                98,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 45,
+                "LineNumber": 1642
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 55,
+                "LineNumber": 1659
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join",
+                1,
+                99,
+                "Fn::If",
+                1,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 45,
+                "LineNumber": 1659
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/public/watchmaker.json",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 31,
+                "LineNumber": 1691
+            },
+            "Path": [
+                "Resources",
+                "WatchmakerInstanceLogGroup",
+                "Properties",
+                "LogGroupName",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 21,
+                "LineNumber": 1691
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    }
+]
diff --git a/test/fixtures/results/quickstart/nist_application.json b/test/fixtures/results/quickstart/nist_application.json
--- a/test/fixtures/results/quickstart/nist_application.json
+++ b/test/fixtures/results/quickstart/nist_application.json
@@ -1,16 +1,62 @@
 [
     {
-        "Rule": {
-            "Id": "W2506",
-            "Description": "See if there are any refs for ImageId to a parameter of inappropriate type. Appropriate Types are [AWS::EC2::Image::Id, AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>]",
-            "ShortDescription": "Check if ImageId Parameters have the correct type",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html#parmtypes"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 95
+            },
+            "Path": [
+                "Outputs",
+                "LandingPageURL",
+                "Value",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 125
+                "ColumnNumber": 7,
+                "LineNumber": 95
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 108
             },
+            "Path": [
+                "Outputs",
+                "WebsiteURL",
+                "Value",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 108
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 10,
                 "LineNumber": 125
@@ -18,24 +64,24 @@
             "Path": [
                 "Parameters",
                 "pAppAmi"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 125
+            }
         },
-        "Level": "Warning",
         "Message": "Parameter pAppAmi should be of type [AWS::EC2::Image::Id, AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>]",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "See if there are any refs for ImageId to a parameter of inappropriate type. Appropriate Types are [AWS::EC2::Image::Id, AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>]",
+            "Id": "W2506",
+            "ShortDescription": "Check if ImageId Parameters have the correct type",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html#parmtypes"
+        }
     },
     {
-        "Rule": {
-            "Id": "W2509",
-            "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 182
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 182
@@ -43,24 +89,24 @@
             "Path": [
                 "Parameters",
                 "pManagementCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 182
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
+            "Id": "W2509",
             "ShortDescription": "CIDR Parameters have allowed values",
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 185
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 185
@@ -68,24 +114,24 @@
             "Path": [
                 "Parameters",
                 "pProductionCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 185
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
+        "Rule": {
+            "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
     },
     {
-        "Rule": {
-            "Id": "W2506",
-            "Description": "See if there are any refs for ImageId to a parameter of inappropriate type. Appropriate Types are [AWS::EC2::Image::Id, AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>]",
-            "ShortDescription": "Check if ImageId Parameters have the correct type",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html#parmtypes"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 213
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 213
@@ -93,50 +139,270 @@
             "Path": [
                 "Parameters",
                 "pWebServerAMI"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 213
+            }
         },
-        "Level": "Warning",
         "Message": "Parameter pWebServerAMI should be of type [AWS::EC2::Image::Id, AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>]",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "See if there are any refs for ImageId to a parameter of inappropriate type. Appropriate Types are [AWS::EC2::Image::Id, AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>]",
+            "Id": "W2506",
+            "ShortDescription": "Check if ImageId Parameters have the correct type",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html#parmtypes"
+        }
     },
     {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
+        "Location": {
+            "End": {
+                "ColumnNumber": 14,
+                "LineNumber": 219
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "DependsOn"
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 219
+            }
+        },
+        "Message": "Obsolete DependsOn on resource (rRDSInstanceMySQL), dependency already enforced by a \"Fn:GetAtt\" at Resources/rAutoScalingConfigApp/Metadata/AWS::CloudFormation::Init/install_wordpress/files//tmp/create-wp-config/content/Fn::Join/1/12/Fn::GetAtt/['rRDSInstanceMySQL', 'Endpoint.Address']",
         "Rule": {
-            "Id": "W3005",
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 236
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "copy_landing_content",
+                "sources",
+                "/var/www/html",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 219
+                "ColumnNumber": 15,
+                "LineNumber": 236
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 244
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "0-download-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 244
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
             "End": {
-                "ColumnNumber": 14,
-                "LineNumber": 219
+                "ColumnNumber": 25,
+                "LineNumber": 255
             },
             "Path": [
                 "Resources",
                 "rAutoScalingConfigApp",
-                "DependsOn"
-            ]
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "3-activate-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 255
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rRDSInstanceMySQL), dependency already enforced by a \"Fn:GetAtt\" at Resources/rAutoScalingConfigApp/Metadata/AWS::CloudFormation::Init/install_wordpress/files//tmp/create-wp-config/content/Fn::Join/1/12/Fn::GetAtt/['rRDSInstanceMySQL', 'Endpoint.Address']",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     },
     {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 264
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "install_cfn",
+                "files",
+                "/etc/cfn/cfn-hup.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 264
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
         "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 284
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "install_cfn",
+                "files",
+                "/etc/cfn/hooks.d/cfn-auto-reloader.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 284
+            }
         },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 324
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "install_wordpress",
+                "files",
+                "/tmp/create-wp-config",
+                "content",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 418
+                "ColumnNumber": 17,
+                "LineNumber": 324
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 388
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 388
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 418
@@ -146,24 +412,120 @@
                 "rAutoScalingConfigWeb",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 418
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rELBApp), dependency already enforced by a \"Fn:GetAtt\" at Resources/rAutoScalingConfigWeb/Metadata/AWS::CloudFormation::Init/nginx/files//tmp/nginx/default.conf/content/Fn::Join/1/9/Fn::GetAtt/['rELBApp', 'DNSName']",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 430
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "0-download-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 430
+            }
         },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 441
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "3-activate-DSA",
+                "command",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 509
+                "ColumnNumber": 17,
+                "LineNumber": 441
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 450
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "nginx",
+                "files",
+                "/tmp/nginx/default.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 450
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 31,
                 "LineNumber": 509
@@ -173,24 +535,53 @@
                 "rAutoScalingConfigWeb",
                 "Properties",
                 "AssociatePublicIpAddress"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 509
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingConfigWeb/Properties/AssociatePublicIpAddress should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 566
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 520
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 520
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 566
@@ -200,24 +591,24 @@
                 "rAutoScalingDownApp",
                 "Properties",
                 "ScalingAdjustment"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 566
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingDownApp/Properties/ScalingAdjustment should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 574
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 574
@@ -227,24 +618,24 @@
                 "rAutoScalingDownWeb",
                 "Properties",
                 "ScalingAdjustment"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 574
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingDownWeb/Properties/ScalingAdjustment should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 577
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 577
@@ -253,24 +644,24 @@
                 "Resources",
                 "rAutoScalingGroupApp",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 577
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rAutoScalingConfigApp), dependency already enforced by a \"Ref\" at Resources/rAutoScalingGroupApp/Properties/LaunchConfigurationName/Ref/rAutoScalingConfigApp",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 582
-            },
             "End": {
                 "ColumnNumber": 29,
                 "LineNumber": 582
@@ -280,24 +671,24 @@
                 "rAutoScalingGroupApp",
                 "Properties",
                 "HealthCheckGracePeriod"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 582
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingGroupApp/Properties/HealthCheckGracePeriod should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 592
-            },
             "End": {
                 "ColumnNumber": 26,
                 "LineNumber": 592
@@ -309,24 +700,24 @@
                 "Tags",
                 0,
                 "PropagateAtLaunch"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 592
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingGroupApp/Properties/Tags/0/PropagateAtLaunch should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 595
-            },
             "End": {
                 "ColumnNumber": 26,
                 "LineNumber": 595
@@ -338,24 +729,24 @@
                 "Tags",
                 1,
                 "PropagateAtLaunch"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 595
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingGroupApp/Properties/Tags/1/PropagateAtLaunch should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 603
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 603
@@ -364,24 +755,24 @@
                 "Resources",
                 "rAutoScalingGroupWeb",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 603
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rAutoScalingConfigWeb), dependency already enforced by a \"Ref\" at Resources/rAutoScalingGroupWeb/Properties/LaunchConfigurationName/Ref/rAutoScalingConfigWeb",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 608
-            },
             "End": {
                 "ColumnNumber": 29,
                 "LineNumber": 608
@@ -391,24 +782,24 @@
                 "rAutoScalingGroupWeb",
                 "Properties",
                 "HealthCheckGracePeriod"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 608
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingGroupWeb/Properties/HealthCheckGracePeriod should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 618
-            },
             "End": {
                 "ColumnNumber": 26,
                 "LineNumber": 618
@@ -420,24 +811,24 @@
                 "Tags",
                 0,
                 "PropagateAtLaunch"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 618
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingGroupWeb/Properties/Tags/0/PropagateAtLaunch should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 621
-            },
             "End": {
                 "ColumnNumber": 26,
                 "LineNumber": 621
@@ -449,24 +840,24 @@
                 "Tags",
                 1,
                 "PropagateAtLaunch"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 621
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingGroupWeb/Properties/Tags/1/PropagateAtLaunch should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 634
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 634
@@ -476,24 +867,24 @@
                 "rAutoScalingUpApp",
                 "Properties",
                 "ScalingAdjustment"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 634
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingUpApp/Properties/ScalingAdjustment should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 642
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 642
@@ -503,24 +894,24 @@
                 "rAutoScalingUpWeb",
                 "Properties",
                 "ScalingAdjustment"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 642
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rAutoScalingUpWeb/Properties/ScalingAdjustment should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 655
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 655
@@ -530,24 +921,24 @@
                 "rCWAlarmHighCPUApp",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 655
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmHighCPUApp/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 658
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 658
@@ -557,24 +948,24 @@
                 "rCWAlarmHighCPUApp",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 658
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmHighCPUApp/Properties/Period should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 660
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 660
@@ -584,24 +975,24 @@
                 "rCWAlarmHighCPUApp",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 660
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmHighCPUApp/Properties/Threshold should be of type Double",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 673
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 673
@@ -611,24 +1002,24 @@
                 "rCWAlarmHighCPUWeb",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 673
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmHighCPUWeb/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 676
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 676
@@ -638,24 +1029,24 @@
                 "rCWAlarmHighCPUWeb",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 676
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmHighCPUWeb/Properties/Period should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 678
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 678
@@ -665,24 +1056,24 @@
                 "rCWAlarmHighCPUWeb",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 678
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmHighCPUWeb/Properties/Threshold should be of type Double",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 690
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 690
@@ -692,24 +1083,24 @@
                 "rCWAlarmLowCPUApp",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 690
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmLowCPUApp/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 693
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 693
@@ -719,24 +1110,24 @@
                 "rCWAlarmLowCPUApp",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 693
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmLowCPUApp/Properties/Period should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 695
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 695
@@ -746,24 +1137,24 @@
                 "rCWAlarmLowCPUApp",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 695
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmLowCPUApp/Properties/Threshold should be of type Double",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 698
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 698
@@ -772,24 +1163,24 @@
                 "Resources",
                 "rCWAlarmLowCPUWeb",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 698
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rAutoScalingGroupWeb), dependency already enforced by a \"Ref\" at Resources/rCWAlarmLowCPUWeb/Properties/Dimensions/0/Value/Ref/rAutoScalingGroupWeb",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 708
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 708
@@ -799,24 +1190,24 @@
                 "rCWAlarmLowCPUWeb",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 708
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmLowCPUWeb/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 711
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 711
@@ -826,24 +1217,24 @@
                 "rCWAlarmLowCPUWeb",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 711
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmLowCPUWeb/Properties/Period should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 713
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 713
@@ -853,24 +1244,24 @@
                 "rCWAlarmLowCPUWeb",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 713
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCWAlarmLowCPUWeb/Properties/Threshold should be of type Double",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 724
-            },
             "End": {
                 "ColumnNumber": 23,
                 "LineNumber": 724
@@ -880,24 +1271,24 @@
                 "rELBApp",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 724
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rS3ELBAccessLogs), dependency already enforced by a \"Ref\" at Resources/rELBApp/Properties/AccessLoggingPolicy/S3BucketName/Ref/rS3ELBAccessLogs",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "W3005",
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 725
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 725
@@ -907,24 +1298,24 @@
                 "rELBApp",
                 "DependsOn",
                 1
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 725
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rSecurityGroupApp), dependency already enforced by a \"Ref\" at Resources/rELBApp/Properties/SecurityGroups/0/Ref/rSecurityGroupApp",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 729
-            },
             "End": {
                 "ColumnNumber": 21,
                 "LineNumber": 729
@@ -935,24 +1326,24 @@
                 "Properties",
                 "AccessLoggingPolicy",
                 "EmitInterval"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 729
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rELBApp/Properties/AccessLoggingPolicy/EmitInterval should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 730
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 730
@@ -963,24 +1354,24 @@
                 "Properties",
                 "AccessLoggingPolicy",
                 "Enabled"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 730
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rELBApp/Properties/AccessLoggingPolicy/Enabled should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 760
-            },
             "End": {
                 "ColumnNumber": 23,
                 "LineNumber": 760
@@ -990,24 +1381,24 @@
                 "rELBWeb",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 760
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rS3ELBAccessLogs), dependency already enforced by a \"Ref\" at Resources/rELBWeb/Properties/AccessLoggingPolicy/S3BucketName/Ref/rS3ELBAccessLogs",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "W3005",
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 761
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 761
@@ -1017,24 +1408,24 @@
                 "rELBWeb",
                 "DependsOn",
                 1
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 761
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rSecurityGroupWeb), dependency already enforced by a \"Ref\" at Resources/rELBWeb/Properties/SecurityGroups/0/Ref/rSecurityGroupWeb",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 765
-            },
             "End": {
                 "ColumnNumber": 21,
                 "LineNumber": 765
@@ -1045,24 +1436,24 @@
                 "Properties",
                 "AccessLoggingPolicy",
                 "EmitInterval"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 765
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rELBWeb/Properties/AccessLoggingPolicy/EmitInterval should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 766
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 766
@@ -1073,24 +1464,85 @@
                 "Properties",
                 "AccessLoggingPolicy",
                 "Enabled"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 766
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rELBWeb/Properties/AccessLoggingPolicy/Enabled should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 813
+            },
+            "Path": [
+                "Resources",
+                "rPostProcInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 1004
+                "ColumnNumber": 11,
+                "LineNumber": 813
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 923
             },
+            "Path": [
+                "Resources",
+                "rPostProcInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join",
+                1,
+                44,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 15,
+                "LineNumber": 923
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 21,
                 "LineNumber": 1004
@@ -1100,24 +1552,24 @@
                 "rRDSInstanceMySQL",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 1004
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rDBSubnetGroup), dependency already enforced by a \"Ref\" at Resources/rRDSInstanceMySQL/Properties/DBSubnetGroupName/Ref/rDBSubnetGroup",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "W3005",
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 1005
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 1005
@@ -1127,24 +1579,24 @@
                 "rRDSInstanceMySQL",
                 "DependsOn",
                 1
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 1005
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rSecurityGroupRDS), dependency already enforced by a \"Ref\" at Resources/rRDSInstanceMySQL/Properties/VPCSecurityGroups/0/Ref/rSecurityGroupRDS",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 1020
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 1020
@@ -1154,51 +1606,82 @@
                 "rRDSInstanceMySQL",
                 "Properties",
                 "MultiAZ"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 1020
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rRDSInstanceMySQL/Properties/MultiAZ should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 1021
+            },
+            "Path": [
+                "Resources",
+                "rRDSInstanceMySQL",
+                "Properties",
+                "StorageEncrypted"
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 1021
+            }
+        },
+        "Message": "Property Resources/rRDSInstanceMySQL/Properties/StorageEncrypted should be of type Boolean",
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 1021
-            },
             "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 1021
+                "ColumnNumber": 21,
+                "LineNumber": 1042
             },
             "Path": [
                 "Resources",
-                "rRDSInstanceMySQL",
+                "rS3AccessLogsPolicy",
                 "Properties",
-                "StorageEncrypted"
-            ]
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 1042
+            }
         },
-        "Level": "Error",
-        "Message": "Property Resources/rRDSInstanceMySQL/Properties/StorageEncrypted should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     },
     {
-        "Rule": {
-            "Id": "W2511",
-            "Description": "See if the elements inside an IAM Resource policy are configured correctly.",
-            "ShortDescription": "Check IAM Resource Policies syntax",
-            "Source": "https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1057
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 1057
@@ -1209,24 +1692,24 @@
                 "Properties",
                 "PolicyDocument",
                 "Version"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1057
+            }
         },
-        "Level": "Warning",
         "Message": "IAM Policy Version should be updated to '2012-10-17'.",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "See if the elements inside an IAM Resource policy are configured correctly.",
+            "Id": "W2511",
+            "ShortDescription": "Check IAM Resource Policies syntax",
+            "Source": "https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1069
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1069
@@ -1238,24 +1721,24 @@
                 "SecurityGroupEgress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1069
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/0/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1071
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1071
@@ -1267,24 +1750,24 @@
                 "SecurityGroupEgress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1071
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/0/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1073
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1073
@@ -1296,24 +1779,24 @@
                 "SecurityGroupEgress",
                 1,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1073
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/1/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1075
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1075
@@ -1325,24 +1808,24 @@
                 "SecurityGroupEgress",
                 1,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1075
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupEgress/1/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1079
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1079
@@ -1354,24 +1837,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1079
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1081
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1081
@@ -1383,24 +1866,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1081
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupApp/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1097
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1097
@@ -1412,24 +1895,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1097
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1099
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1099
@@ -1441,24 +1924,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1099
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1102
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1102
@@ -1470,24 +1953,24 @@
                 "SecurityGroupIngress",
                 1,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1102
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/1/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1104
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1104
@@ -1499,24 +1982,24 @@
                 "SecurityGroupIngress",
                 1,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1104
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/1/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1107
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1107
@@ -1528,24 +2011,24 @@
                 "SecurityGroupIngress",
                 2,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1107
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/2/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1109
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1109
@@ -1557,24 +2040,24 @@
                 "SecurityGroupIngress",
                 2,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1109
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupAppInstance/Properties/SecurityGroupIngress/2/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1123
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1123
@@ -1586,24 +2069,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1123
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupRDS/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
-        "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1127
-            },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1127
@@ -1615,24 +2098,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1127
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupRDS/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1142
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1142
@@ -1644,24 +2127,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1142
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWeb/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1144
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1144
@@ -1673,24 +2156,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1144
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWeb/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1154
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1154
@@ -1702,24 +2185,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1154
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1156
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1156
@@ -1731,24 +2214,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1156
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1159
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1159
@@ -1760,24 +2243,24 @@
                 "SecurityGroupIngress",
                 1,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1159
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/1/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1161
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1161
@@ -1789,24 +2272,24 @@
                 "SecurityGroupIngress",
                 1,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1161
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/1/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1164
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1164
@@ -1818,24 +2301,24 @@
                 "SecurityGroupIngress",
                 2,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1164
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/2/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1166
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1166
@@ -1847,24 +2330,24 @@
                 "SecurityGroupIngress",
                 2,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1166
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupWebInstance/Properties/SecurityGroupIngress/2/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1182
-            },
             "End": {
                 "ColumnNumber": 27,
                 "LineNumber": 1182
@@ -1877,24 +2360,24 @@
                 "Rules",
                 0,
                 "ExpirationInDays"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1182
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rWebContentBucket/Properties/LifecycleConfiguration/Rules/0/ExpirationInDays should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 1191
-            },
             "End": {
                 "ColumnNumber": 29,
                 "LineNumber": 1191
@@ -1908,24 +2391,24 @@
                 0,
                 "Transition",
                 "TransitionInDays"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 1191
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rWebContentBucket/Properties/LifecycleConfiguration/Rules/0/Transition/TransitionInDays should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 1197
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 1197
@@ -1934,24 +2417,24 @@
                 "Resources",
                 "rWebContentS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 1197
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/Bucket/Ref/rWebContentBucket",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "W3005",
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 1197
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 1197
@@ -1960,24 +2443,24 @@
                 "Resources",
                 "rWebContentS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 1197
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/0/Resource/Fn::Join/1/3/Ref/rWebContentBucket",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
-    },
-    {
         "Rule": {
-            "Id": "W3005",
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 1197
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 1197
@@ -1986,10 +2469,80 @@
                 "Resources",
                 "rWebContentS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 1197
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/1/Resource/Fn::Join/1/3/Ref/rWebContentBucket",
-        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 1210
+            },
+            "Path": [
+                "Resources",
+                "rWebContentS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 1210
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 1227
+            },
+            "Path": [
+                "Resources",
+                "rWebContentS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                1,
+                "Resource",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 1227
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     }
-]
\ No newline at end of file
+]
diff --git a/test/fixtures/results/quickstart/nist_high_master.json b/test/fixtures/results/quickstart/nist_high_master.json
--- a/test/fixtures/results/quickstart/nist_high_master.json
+++ b/test/fixtures/results/quickstart/nist_high_master.json
@@ -7,14 +7,14 @@
                 "ColumnNumber": 30,
                 "LineNumber": 11
             },
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 11
-            },
             "Path": [
                 "Conditions",
                 "LoadConfigRulesTemplateAuto"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 11
+            }
         },
         "Message": "Condition LoadConfigRulesTemplateAuto not used",
         "Rule": {
@@ -32,18 +32,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 278
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 278
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetB']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetA']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -59,18 +59,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 278
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 278
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetA']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetB']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -86,18 +86,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 278
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 278
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetB']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetA']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -113,18 +113,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 278
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 278
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetA']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetB']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -140,18 +140,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 278
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 278
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetB']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetA']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -167,18 +167,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 278
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 278
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetA']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetB']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -194,16 +194,16 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 278
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 278
+            }
         },
         "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rVPCProduction']",
         "Rule": {
@@ -221,16 +221,16 @@
                 "ColumnNumber": 28,
                 "LineNumber": 279
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 279
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 1
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 279
+            }
         },
         "Message": "Obsolete DependsOn on resource (ManagementVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDeepSecurityAgentDownload/Fn::GetAtt/['ManagementVpcTemplate', 'Outputs.rDeepSecurityAgentDownload']",
         "Rule": {
@@ -248,16 +248,16 @@
                 "ColumnNumber": 28,
                 "LineNumber": 279
             },
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 279
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
                 "DependsOn",
                 1
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 279
+            }
         },
         "Message": "Obsolete DependsOn on resource (ManagementVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDeepSecurityHeartbeat/Fn::GetAtt/['ManagementVpcTemplate', 'Outputs.rDeepSecurityHeartbeat']",
         "Rule": {
@@ -275,10 +275,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 293
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 293
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -286,7 +282,11 @@
                 "Parameters",
                 "pAppPrivateSubnetA",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 293
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt",
         "Rule": {
@@ -304,10 +304,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 297
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 297
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -315,7 +311,11 @@
                 "Parameters",
                 "pAppPrivateSubnetB",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 297
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt",
         "Rule": {
@@ -333,10 +333,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 311
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 311
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -344,7 +340,11 @@
                 "Parameters",
                 "pDBPrivateSubnetA",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 311
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt",
         "Rule": {
@@ -362,10 +362,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 315
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 315
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -373,7 +369,11 @@
                 "Parameters",
                 "pDBPrivateSubnetB",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 315
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt",
         "Rule": {
@@ -391,10 +391,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 320
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 320
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -402,7 +398,11 @@
                 "Parameters",
                 "pDMZSubnetA",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 320
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt",
         "Rule": {
@@ -420,10 +420,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 324
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 324
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -431,7 +427,11 @@
                 "Parameters",
                 "pDMZSubnetB",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 324
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt",
         "Rule": {
@@ -449,10 +449,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 345
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 345
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -460,7 +456,11 @@
                 "Parameters",
                 "pProductionVPC",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 345
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt",
         "Rule": {
@@ -478,10 +478,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 353
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 353
-            },
             "Path": [
                 "Resources",
                 "ApplicationTemplate",
@@ -489,7 +485,11 @@
                 "Parameters",
                 "pSecurityAlarmTopic",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 353
+            }
         },
         "Message": "GetAtt to resource \"LoggingTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ApplicationTemplate/Properties/Parameters/pSecurityAlarmTopic/Fn::GetAtt",
         "Rule": {
@@ -501,14 +501,38 @@
     },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
-        "Level": "Error",
+        "Level": "Informational",
         "Location": {
             "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 384
+                "ColumnNumber": 17,
+                "LineNumber": 377
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
+                "ColumnNumber": 9,
+                "LineNumber": 377
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Error",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
                 "LineNumber": 384
             },
             "Path": [
@@ -516,7 +540,11 @@
                 "ApplicationTemplate",
                 "Properties",
                 "TimeoutInMinutes"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 384
+            }
         },
         "Message": "Property Resources/ApplicationTemplate/Properties/TimeoutInMinutes should be of type Integer",
         "Rule": {
@@ -528,14 +556,38 @@
     },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
-        "Level": "Error",
+        "Level": "Informational",
         "Location": {
             "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 408
+                "ColumnNumber": 17,
+                "LineNumber": 401
             },
+            "Path": [
+                "Resources",
+                "ConfigRulesTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
+                "ColumnNumber": 9,
+                "LineNumber": 401
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Error",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
                 "LineNumber": 408
             },
             "Path": [
@@ -543,7 +595,11 @@
                 "ConfigRulesTemplate",
                 "Properties",
                 "TimeoutInMinutes"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 408
+            }
         },
         "Message": "Property Resources/ConfigRulesTemplate/Properties/TimeoutInMinutes should be of type Integer",
         "Rule": {
@@ -555,14 +611,38 @@
     },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
-        "Level": "Error",
+        "Level": "Informational",
         "Location": {
             "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 421
+                "ColumnNumber": 17,
+                "LineNumber": 414
             },
+            "Path": [
+                "Resources",
+                "IamTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
+                "ColumnNumber": 9,
+                "LineNumber": 414
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Error",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
                 "LineNumber": 421
             },
             "Path": [
@@ -570,7 +650,11 @@
                 "IamTemplate",
                 "Properties",
                 "TimeoutInMinutes"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 421
+            }
         },
         "Message": "Property Resources/IamTemplate/Properties/TimeoutInMinutes should be of type Integer",
         "Rule": {
@@ -582,14 +666,38 @@
     },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
-        "Level": "Error",
+        "Level": "Informational",
         "Location": {
             "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 442
+                "ColumnNumber": 17,
+                "LineNumber": 435
             },
+            "Path": [
+                "Resources",
+                "LoggingTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
+                "ColumnNumber": 9,
+                "LineNumber": 435
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Error",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
                 "LineNumber": 442
             },
             "Path": [
@@ -597,7 +705,11 @@
                 "LoggingTemplate",
                 "Properties",
                 "TimeoutInMinutes"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 442
+            }
         },
         "Message": "Property Resources/LoggingTemplate/Properties/TimeoutInMinutes should be of type Integer",
         "Rule": {
@@ -615,17 +727,17 @@
                 "ColumnNumber": 14,
                 "LineNumber": 445
             },
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 445
-            },
             "Path": [
                 "Resources",
                 "ManagementVpcTemplate",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 445
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rRouteTableProdPublic']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rVPCProduction']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -641,15 +753,15 @@
                 "ColumnNumber": 14,
                 "LineNumber": 445
             },
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 445
-            },
             "Path": [
                 "Resources",
                 "ManagementVpcTemplate",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 445
+            }
         },
         "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPrivate/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rRouteTableProdPrivate']",
         "Rule": {
@@ -667,17 +779,17 @@
                 "ColumnNumber": 14,
                 "LineNumber": 445
             },
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 445
-            },
             "Path": [
                 "Resources",
                 "ManagementVpcTemplate",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 445
+            }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rVPCProduction']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rRouteTableProdPublic']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -693,10 +805,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 490
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 490
-            },
             "Path": [
                 "Resources",
                 "ManagementVpcTemplate",
@@ -704,7 +812,11 @@
                 "Parameters",
                 "pProductionVPC",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 490
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt",
         "Rule": {
@@ -722,10 +834,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 498
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 498
-            },
             "Path": [
                 "Resources",
                 "ManagementVpcTemplate",
@@ -733,7 +841,11 @@
                 "Parameters",
                 "pRouteTableProdPrivate",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 498
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPrivate/Fn::GetAtt",
         "Rule": {
@@ -751,10 +863,6 @@
                 "ColumnNumber": 21,
                 "LineNumber": 502
             },
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 502
-            },
             "Path": [
                 "Resources",
                 "ManagementVpcTemplate",
@@ -762,7 +870,11 @@
                 "Parameters",
                 "pRouteTableProdPublic",
                 "Fn::GetAtt"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 502
+            }
         },
         "Message": "GetAtt to resource \"ProductionVpcTemplate\" that may not be available when condition \"EulaAccepted\" is False at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt",
         "Rule": {
@@ -774,14 +886,38 @@
     },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
-        "Level": "Error",
+        "Level": "Informational",
         "Location": {
             "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 523
+                "ColumnNumber": 17,
+                "LineNumber": 516
             },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
+                "ColumnNumber": 9,
+                "LineNumber": 516
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Error",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
                 "LineNumber": 523
             },
             "Path": [
@@ -789,7 +925,11 @@
                 "ManagementVpcTemplate",
                 "Properties",
                 "TimeoutInMinutes"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 523
+            }
         },
         "Message": "Property Resources/ManagementVpcTemplate/Properties/TimeoutInMinutes should be of type Integer",
         "Rule": {
@@ -801,14 +941,38 @@
     },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
-        "Level": "Error",
+        "Level": "Informational",
         "Location": {
             "End": {
-                "ColumnNumber": 23,
-                "LineNumber": 577
+                "ColumnNumber": 17,
+                "LineNumber": 570
             },
+            "Path": [
+                "Resources",
+                "ProductionVpcTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
+                "ColumnNumber": 9,
+                "LineNumber": 570
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Error",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
                 "LineNumber": 577
             },
             "Path": [
@@ -816,7 +980,11 @@
                 "ProductionVpcTemplate",
                 "Properties",
                 "TimeoutInMinutes"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 577
+            }
         },
         "Message": "Property Resources/ProductionVpcTemplate/Properties/TimeoutInMinutes should be of type Integer",
         "Rule": {
@@ -826,4 +994,4 @@
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
         }
     }
-]
\ No newline at end of file
+]
diff --git a/test/fixtures/results/quickstart/nist_logging.json b/test/fixtures/results/quickstart/nist_logging.json
--- a/test/fixtures/results/quickstart/nist_logging.json
+++ b/test/fixtures/results/quickstart/nist_logging.json
@@ -1,15 +1,8 @@
 [
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 47
-            },
             "End": {
                 "ColumnNumber": 27,
                 "LineNumber": 47
@@ -22,23 +15,24 @@
                 "Rules",
                 0,
                 "ExpirationInDays"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 47
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rArchiveLogsBucket/Properties/LifecycleConfiguration/Rules/0/ExpirationInDays should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 13,
-                "LineNumber": 56
-            },
             "End": {
                 "ColumnNumber": 29,
                 "LineNumber": 56
@@ -52,23 +46,24 @@
                 0,
                 "Transition",
                 "TransitionInDays"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 56
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rArchiveLogsBucket/Properties/LifecycleConfiguration/Rules/0/Transition/TransitionInDays should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 61
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 61
@@ -77,23 +72,24 @@
                 "Resources",
                 "rArchiveLogsBucketPolicy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 61
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by \"!Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/Bucket/Ref/rArchiveLogsBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by a \"Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/Bucket/Ref/rArchiveLogsBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 61
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 61
@@ -102,23 +98,24 @@
                 "Resources",
                 "rArchiveLogsBucketPolicy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 61
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by \"!Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/PolicyDocument/Statement/0/Resource/0/Fn::Join/1/3/Ref/rArchiveLogsBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by a \"Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/PolicyDocument/Statement/0/Resource/0/Fn::Join/1/3/Ref/rArchiveLogsBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 61
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 61
@@ -127,23 +124,24 @@
                 "Resources",
                 "rArchiveLogsBucketPolicy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 61
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by \"!Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/PolicyDocument/Statement/1/Resource/0/Fn::Join/1/3/Ref/rArchiveLogsBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by a \"Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/PolicyDocument/Statement/1/Resource/0/Fn::Join/1/3/Ref/rArchiveLogsBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 61
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 61
@@ -152,23 +150,120 @@
                 "Resources",
                 "rArchiveLogsBucketPolicy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 61
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by \"!Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/PolicyDocument/Statement/2/Resource/0/Fn::Join/1/3/Ref/rArchiveLogsBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
+        "Message": "Obsolete DependsOn on resource (rArchiveLogsBucket), dependency already enforced by a \"Ref\" at Resources/rArchiveLogsBucketPolicy/Properties/PolicyDocument/Statement/2/Resource/0/Fn::Join/1/3/Ref/rArchiveLogsBucket",
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 74
+            },
+            "Path": [
+                "Resources",
+                "rArchiveLogsBucketPolicy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 74
+            }
         },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 89
+            },
+            "Path": [
+                "Resources",
+                "rArchiveLogsBucketPolicy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                1,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 151
+                "ColumnNumber": 13,
+                "LineNumber": 89
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 107
             },
+            "Path": [
+                "Resources",
+                "rArchiveLogsBucketPolicy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                2,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 107
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 151
@@ -178,23 +273,24 @@
                 "rCloudTrailChangeAlarm",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 151
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCloudTrailChangeAlarm/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 154
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 154
@@ -204,23 +300,24 @@
                 "rCloudTrailChangeAlarm",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 154
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCloudTrailChangeAlarm/Properties/Period should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 156
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 156
@@ -230,23 +327,24 @@
                 "rCloudTrailChangeAlarm",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 156
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCloudTrailChangeAlarm/Properties/Threshold should be of type Double",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 160
-            },
             "End": {
                 "ColumnNumber": 22,
                 "LineNumber": 160
@@ -256,23 +354,24 @@
                 "rCloudTrailLogGroup",
                 "Properties",
                 "RetentionInDays"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 160
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rCloudTrailLogGroup/Properties/RetentionInDays should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 180
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 180
@@ -281,23 +380,92 @@
                 "Resources",
                 "rCloudTrailProfile",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 180
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rCloudTrailRole), dependency already enforced by \"!Ref\" at Resources/rCloudTrailProfile/Properties/Roles/0/Ref/rCloudTrailRole",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rCloudTrailRole), dependency already enforced by a \"Ref\" at Resources/rCloudTrailProfile/Properties/Roles/0/Ref/rCloudTrailRole",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 204
+            },
+            "Path": [
+                "Resources",
+                "rCloudTrailRole",
+                "Properties",
+                "Policies",
+                0,
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 232
+                "ColumnNumber": 15,
+                "LineNumber": 204
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 218
             },
+            "Path": [
+                "Resources",
+                "rCloudTrailRole",
+                "Properties",
+                "Policies",
+                0,
+                "PolicyDocument",
+                "Statement",
+                1,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 15,
+                "LineNumber": 218
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 232
@@ -306,23 +474,24 @@
                 "Resources",
                 "rCloudTrailS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 232
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by \"!Ref\" at Resources/rCloudTrailS3Policy/Properties/Bucket/Ref/rCloudTrailBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by a \"Ref\" at Resources/rCloudTrailS3Policy/Properties/Bucket/Ref/rCloudTrailBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 232
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 232
@@ -331,23 +500,24 @@
                 "Resources",
                 "rCloudTrailS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 232
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by \"!Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/0/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by a \"Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/0/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 232
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 232
@@ -356,23 +526,24 @@
                 "Resources",
                 "rCloudTrailS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 232
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by \"!Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/1/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by a \"Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/1/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 232
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 232
@@ -381,23 +552,50 @@
                 "Resources",
                 "rCloudTrailS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 232
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by \"!Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/2/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by a \"Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/2/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
         "Location": {
+            "End": {
+                "ColumnNumber": 14,
+                "LineNumber": 232
+            },
+            "Path": [
+                "Resources",
+                "rCloudTrailS3Policy",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 232
-            },
+            }
+        },
+        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by a \"Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/3/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 232
@@ -406,48 +604,252 @@
                 "Resources",
                 "rCloudTrailS3Policy",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 232
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by \"!Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/3/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
+        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by a \"Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/4/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
         "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 243
+            },
+            "Path": [
+                "Resources",
+                "rCloudTrailS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 232
+                "ColumnNumber": 13,
+                "LineNumber": 243
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 261
             },
+            "Path": [
+                "Resources",
+                "rCloudTrailS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                1,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 261
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
             "End": {
-                "ColumnNumber": 14,
-                "LineNumber": 232
+                "ColumnNumber": 21,
+                "LineNumber": 279
             },
             "Path": [
                 "Resources",
                 "rCloudTrailS3Policy",
-                "DependsOn"
-            ]
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                2,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 279
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rCloudTrailBucket), dependency already enforced by \"!Ref\" at Resources/rCloudTrailS3Policy/Properties/PolicyDocument/Statement/4/Resource/0/Fn::Join/1/3/Ref/rCloudTrailBucket",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     },
     {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 294
+            },
+            "Path": [
+                "Resources",
+                "rCloudTrailS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                3,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 294
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
         "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 312
+            },
+            "Path": [
+                "Resources",
+                "rCloudTrailS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                4,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 312
+            }
         },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 342
+            },
+            "Path": [
+                "Resources",
+                "rCloudWatchLogsRole",
+                "Properties",
+                "Policies",
+                0,
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 399
+                "ColumnNumber": 15,
+                "LineNumber": 342
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 361
             },
+            "Path": [
+                "Resources",
+                "rCloudWatchLogsRole",
+                "Properties",
+                "Policies",
+                0,
+                "PolicyDocument",
+                "Statement",
+                1,
+                "Resource",
+                0,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 15,
+                "LineNumber": 361
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 399
@@ -457,23 +859,24 @@
                 "rIAMCreateAccessKeyAlarm",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 399
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rIAMCreateAccessKeyAlarm/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 402
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 402
@@ -483,23 +886,24 @@
                 "rIAMCreateAccessKeyAlarm",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 402
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rIAMCreateAccessKeyAlarm/Properties/Period should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 404
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 404
@@ -509,23 +913,24 @@
                 "rIAMCreateAccessKeyAlarm",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 404
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rIAMCreateAccessKeyAlarm/Properties/Threshold should be of type Double",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 414
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 414
@@ -535,23 +940,24 @@
                 "rIAMPolicyChangesAlarm",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 414
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rIAMPolicyChangesAlarm/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 417
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 417
@@ -561,23 +967,24 @@
                 "rIAMPolicyChangesAlarm",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 417
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rIAMPolicyChangesAlarm/Properties/Period should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 419
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 419
@@ -587,23 +994,24 @@
                 "rIAMPolicyChangesAlarm",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 419
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rIAMPolicyChangesAlarm/Properties/Threshold should be of type Double",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 450
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 450
@@ -613,23 +1021,24 @@
                 "rNetworkAclChangesAlarm",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 450
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNetworkAclChangesAlarm/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 453
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 453
@@ -639,23 +1048,24 @@
                 "rNetworkAclChangesAlarm",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 453
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNetworkAclChangesAlarm/Properties/Period should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 455
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 455
@@ -665,23 +1075,24 @@
                 "rNetworkAclChangesAlarm",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 455
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNetworkAclChangesAlarm/Properties/Threshold should be of type Double",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 478
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 478
@@ -691,23 +1102,24 @@
                 "rRootActivityAlarm",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 478
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rRootActivityAlarm/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 481
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 481
@@ -717,23 +1129,24 @@
                 "rRootActivityAlarm",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 481
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rRootActivityAlarm/Properties/Period should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 483
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 483
@@ -743,23 +1156,24 @@
                 "rRootActivityAlarm",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 483
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rRootActivityAlarm/Properties/Threshold should be of type Double",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 501
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 501
@@ -769,23 +1183,24 @@
                 "rSecurityGroupChangesAlarm",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 501
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupChangesAlarm/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 504
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 504
@@ -795,23 +1210,24 @@
                 "rSecurityGroupChangesAlarm",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 504
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupChangesAlarm/Properties/Period should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 506
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 506
@@ -821,23 +1237,24 @@
                 "rSecurityGroupChangesAlarm",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 506
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupChangesAlarm/Properties/Threshold should be of type Double",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 529
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 529
@@ -847,23 +1264,24 @@
                 "rUnauthorizedAttemptAlarm",
                 "Properties",
                 "EvaluationPeriods"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 529
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rUnauthorizedAttemptAlarm/Properties/EvaluationPeriods should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 532
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 532
@@ -873,23 +1291,24 @@
                 "rUnauthorizedAttemptAlarm",
                 "Properties",
                 "Period"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 532
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rUnauthorizedAttemptAlarm/Properties/Period should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_logging.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 534
-            },
             "End": {
                 "ColumnNumber": 16,
                 "LineNumber": 534
@@ -899,10 +1318,18 @@
                 "rUnauthorizedAttemptAlarm",
                 "Properties",
                 "Threshold"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 534
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rUnauthorizedAttemptAlarm/Properties/Threshold should be of type Double",
-        "Filename": "test/templates/quickstart/nist_logging.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     }
-]
\ No newline at end of file
+]
diff --git a/test/fixtures/results/quickstart/nist_vpc_management.json b/test/fixtures/results/quickstart/nist_vpc_management.json
--- a/test/fixtures/results/quickstart/nist_vpc_management.json
+++ b/test/fixtures/results/quickstart/nist_vpc_management.json
@@ -1,29 +1,4 @@
 [
-    {
-        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
-        "Level": "Warning",
-        "Location": {
-            "End": {
-                "ColumnNumber": 18,
-                "LineNumber": 267
-            },
-            "Path": [
-                "Parameters",
-                "pProductionCIDR"
-            ],
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 267
-            }
-        },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Rule": {
-            "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "Id": "W2509",
-            "ShortDescription": "CIDR Parameters have allowed values",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
-        }
-    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
         "Level": "Warning",
@@ -116,7 +91,7 @@
                 "LineNumber": 200
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pBastionSSHCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pBastionSSHCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -141,7 +116,7 @@
                 "LineNumber": 232
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -166,7 +141,7 @@
                 "LineNumber": 236
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementDMZSubnetACIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementDMZSubnetACIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -191,7 +166,7 @@
                 "LineNumber": 240
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementDMZSubnetBCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementDMZSubnetBCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -216,7 +191,7 @@
                 "LineNumber": 244
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementPrivateSubnetACIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementPrivateSubnetACIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -241,7 +216,7 @@
                 "LineNumber": 248
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementPrivateSubnetBCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementPrivateSubnetBCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -249,6 +224,116 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Warning",
+        "Location": {
+            "End": {
+                "ColumnNumber": 18,
+                "LineNumber": 267
+            },
+            "Path": [
+                "Parameters",
+                "pProductionCIDR"
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 267
+            }
+        },
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
+        "Rule": {
+            "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 322
+            },
+            "Path": [
+                "Resources",
+                "rDHCPoptions",
+                "Properties",
+                "DomainName",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 322
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 343
+            },
+            "Path": [
+                "Resources",
+                "rDeepSecurityInfrastructureTemplate",
+                "Properties",
+                "Parameters",
+                "CfnUrlPrefix",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 343
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 388
+            },
+            "Path": [
+                "Resources",
+                "rDeepSecurityInfrastructureTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 388
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
         "Level": "Warning",
@@ -294,7 +379,7 @@
                 "LineNumber": 480
             }
         },
-        "Message": "Obsolete DependsOn on resource (rDeepSecurityInfrastructureTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/rMgmtBastionInstance/Metadata/AWS::CloudFormation::Init/installDeepSecurityAgent/commands/3-activate-DSA/command/Fn::Join/1/1/Fn::GetAtt/['rDeepSecurityInfrastructureTemplate', 'Outputs.DeepSecurityHeartbeat']",
+        "Message": "Obsolete DependsOn on resource (rDeepSecurityInfrastructureTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/rMgmtBastionInstance/Metadata/AWS::CloudFormation::Init/installDeepSecurityAgent/commands/0-download-DSA/command/Fn::Join/1/1/Fn::GetAtt/['rDeepSecurityInfrastructureTemplate', 'Outputs.DeepSecurityAgentDownload']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -321,7 +406,7 @@
                 "LineNumber": 480
             }
         },
-        "Message": "Obsolete DependsOn on resource (rDeepSecurityInfrastructureTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/rMgmtBastionInstance/Metadata/AWS::CloudFormation::Init/installDeepSecurityAgent/commands/0-download-DSA/command/Fn::Join/1/1/Fn::GetAtt/['rDeepSecurityInfrastructureTemplate', 'Outputs.DeepSecurityAgentDownload']",
+        "Message": "Obsolete DependsOn on resource (rDeepSecurityInfrastructureTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/rMgmtBastionInstance/Metadata/AWS::CloudFormation::Init/installDeepSecurityAgent/commands/3-activate-DSA/command/Fn::Join/1/1/Fn::GetAtt/['rDeepSecurityInfrastructureTemplate', 'Outputs.DeepSecurityHeartbeat']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -329,6 +414,127 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 491
+            },
+            "Path": [
+                "Resources",
+                "rMgmtBastionInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "0-download-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 491
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 504
+            },
+            "Path": [
+                "Resources",
+                "rMgmtBastionInstance",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "3-activate-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 504
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 527
+            },
+            "Path": [
+                "Resources",
+                "rMgmtBastionInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 527
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 579
+            },
+            "Path": [
+                "Resources",
+                "rNatInstanceTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 579
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_vpc_management.yaml",
         "Level": "Error",
diff --git a/test/fixtures/results/quickstart/nist_vpc_production.json b/test/fixtures/results/quickstart/nist_vpc_production.json
--- a/test/fixtures/results/quickstart/nist_vpc_production.json
+++ b/test/fixtures/results/quickstart/nist_vpc_production.json
@@ -1,15 +1,8 @@
 [
     {
-        "Rule": {
-            "Id": "W2509",
-            "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 99
-            },
             "End": {
                 "ColumnNumber": 25,
                 "LineNumber": 99
@@ -17,23 +10,24 @@
             "Path": [
                 "Parameters",
                 "pAppPrivateSubnetACIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 99
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pAppPrivateSubnetACIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pAppPrivateSubnetACIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 103
-            },
             "End": {
                 "ColumnNumber": 25,
                 "LineNumber": 103
@@ -41,23 +35,24 @@
             "Path": [
                 "Parameters",
                 "pAppPrivateSubnetBCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 103
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pAppPrivateSubnetBCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pAppPrivateSubnetBCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 107
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 107
@@ -65,23 +60,24 @@
             "Path": [
                 "Parameters",
                 "pBastionSSHCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 107
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pBastionSSHCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pBastionSSHCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 111
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 111
@@ -89,23 +85,24 @@
             "Path": [
                 "Parameters",
                 "pDBPrivateSubnetACIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 111
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDBPrivateSubnetACIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDBPrivateSubnetACIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 115
-            },
             "End": {
                 "ColumnNumber": 24,
                 "LineNumber": 115
@@ -113,23 +110,24 @@
             "Path": [
                 "Parameters",
                 "pDBPrivateSubnetBCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 115
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDBPrivateSubnetBCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDBPrivateSubnetBCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 119
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 119
@@ -137,23 +135,24 @@
             "Path": [
                 "Parameters",
                 "pDMZSubnetACIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 119
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDMZSubnetACIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDMZSubnetACIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 123
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 123
@@ -161,23 +160,24 @@
             "Path": [
                 "Parameters",
                 "pDMZSubnetBCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 123
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDMZSubnetBCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pDMZSubnetBCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 135
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 135
@@ -185,23 +185,24 @@
             "Path": [
                 "Parameters",
                 "pManagementCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 135
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
-            "Id": "W2509",
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
-            "ShortDescription": "CIDR Parameters have allowed values"
-        },
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 149
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 149
@@ -209,23 +210,24 @@
             "Path": [
                 "Parameters",
                 "pProductionCIDR"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 149
+            }
         },
-        "Level": "Warning",
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
+        "Rule": {
+            "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
+            "Id": "W2509",
+            "ShortDescription": "CIDR Parameters have allowed values",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref and GetAtt implicitly results in DependsOn behaviour.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 308
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 308
@@ -234,23 +236,24 @@
                 "Resources",
                 "rGWAttachmentProdIGW",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 308
+            }
         },
-        "Level": "Warning",
-        "Message": "Obsolete DependsOn on resource (rIGWProd), dependency already enforced by \"!Ref\" at Resources/rGWAttachmentProdIGW/Properties/InternetGatewayId/Ref/rIGWProd",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
+        "Message": "Obsolete DependsOn on resource (rIGWProd), dependency already enforced by a \"Ref\" at Resources/rGWAttachmentProdIGW/Properties/InternetGatewayId/Ref/rIGWProd",
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 383
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 383
@@ -261,23 +264,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 383
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLEgressPublic/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 384
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 384
@@ -288,23 +292,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 384
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLEgressPublic/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 385
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 385
@@ -314,23 +319,24 @@
                 "rNACLRuleAllowALLEgressPublic",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 385
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLEgressPublic/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 387
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 387
@@ -340,23 +346,24 @@
                 "rNACLRuleAllowALLEgressPublic",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 387
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLEgressPublic/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 396
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 396
@@ -367,23 +374,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 396
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLfromPrivEgress/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 397
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 397
@@ -394,23 +402,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 397
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLfromPrivEgress/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 398
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 398
@@ -420,23 +429,24 @@
                 "rNACLRuleAllowALLfromPrivEgress",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 398
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLfromPrivEgress/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 400
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 400
@@ -446,23 +456,24 @@
                 "rNACLRuleAllowALLfromPrivEgress",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 400
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowALLfromPrivEgress/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 408
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 408
@@ -473,23 +484,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 408
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllReturnTCP/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 409
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 409
@@ -500,23 +512,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 409
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllReturnTCP/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 410
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 410
@@ -526,23 +539,24 @@
                 "rNACLRuleAllowAllReturnTCP",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 410
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllReturnTCP/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 412
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 412
@@ -552,23 +566,24 @@
                 "rNACLRuleAllowAllReturnTCP",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 412
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllReturnTCP/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 421
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 421
@@ -579,23 +594,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 421
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternal/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 422
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 422
@@ -606,23 +622,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 422
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternal/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 423
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 423
@@ -632,23 +649,24 @@
                 "rNACLRuleAllowAllTCPInternal",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 423
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternal/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 425
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 425
@@ -658,23 +676,24 @@
                 "rNACLRuleAllowAllTCPInternal",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 425
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternal/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 434
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 434
@@ -685,23 +704,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 434
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternalEgress/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 435
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 435
@@ -712,23 +732,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 435
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternalEgress/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 436
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 436
@@ -738,23 +759,24 @@
                 "rNACLRuleAllowAllTCPInternalEgress",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 436
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternalEgress/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 438
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 438
@@ -764,23 +786,24 @@
                 "rNACLRuleAllowAllTCPInternalEgress",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 438
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowAllTCPInternalEgress/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 446
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 446
@@ -791,23 +814,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 446
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowBastionSSHAccess/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 447
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 447
@@ -818,23 +842,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 447
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowBastionSSHAccess/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 448
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 448
@@ -844,23 +869,24 @@
                 "rNACLRuleAllowBastionSSHAccess",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 448
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowBastionSSHAccess/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 450
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 450
@@ -870,23 +896,24 @@
                 "rNACLRuleAllowBastionSSHAccess",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 450
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowBastionSSHAccess/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 459
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 459
@@ -897,23 +924,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 459
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowEgressReturnTCP/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 460
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 460
@@ -924,23 +952,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 460
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowEgressReturnTCP/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 461
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 461
@@ -950,23 +979,24 @@
                 "rNACLRuleAllowEgressReturnTCP",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 461
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowEgressReturnTCP/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 463
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 463
@@ -976,23 +1006,24 @@
                 "rNACLRuleAllowEgressReturnTCP",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 463
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowEgressReturnTCP/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 471
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 471
@@ -1003,23 +1034,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 471
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPSPublic/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 472
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 472
@@ -1030,23 +1062,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 472
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPSPublic/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 473
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 473
@@ -1056,23 +1089,24 @@
                 "rNACLRuleAllowHTTPSPublic",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 473
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPSPublic/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 475
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 475
@@ -1082,23 +1116,24 @@
                 "rNACLRuleAllowHTTPSPublic",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 475
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPSPublic/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 484
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 484
@@ -1109,23 +1144,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 484
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPfromProd/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 485
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 485
@@ -1136,23 +1172,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 485
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPfromProd/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 486
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 486
@@ -1162,23 +1199,24 @@
                 "rNACLRuleAllowHTTPfromProd",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 486
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPfromProd/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 488
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 488
@@ -1188,23 +1226,24 @@
                 "rNACLRuleAllowHTTPfromProd",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 488
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowHTTPfromProd/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 497
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 497
@@ -1215,23 +1254,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 497
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowMgmtAccessSSHtoPrivate/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 498
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 498
@@ -1242,23 +1282,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 498
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowMgmtAccessSSHtoPrivate/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 499
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 499
@@ -1268,23 +1309,24 @@
                 "rNACLRuleAllowMgmtAccessSSHtoPrivate",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 499
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowMgmtAccessSSHtoPrivate/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 501
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 501
@@ -1294,23 +1336,24 @@
                 "rNACLRuleAllowMgmtAccessSSHtoPrivate",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 501
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowMgmtAccessSSHtoPrivate/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 509
-            },
             "End": {
                 "ColumnNumber": 13,
                 "LineNumber": 509
@@ -1321,23 +1364,24 @@
                 "Properties",
                 "PortRange",
                 "From"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 509
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowReturnTCPPriv/Properties/PortRange/From should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 510
-            },
             "End": {
                 "ColumnNumber": 11,
                 "LineNumber": 510
@@ -1348,23 +1392,24 @@
                 "Properties",
                 "PortRange",
                 "To"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 510
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowReturnTCPPriv/Properties/PortRange/To should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 511
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 511
@@ -1374,23 +1419,24 @@
                 "rNACLRuleAllowReturnTCPPriv",
                 "Properties",
                 "Protocol"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 511
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowReturnTCPPriv/Properties/Protocol should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 513
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 513
@@ -1400,23 +1446,52 @@
                 "rNACLRuleAllowReturnTCPPriv",
                 "Properties",
                 "RuleNumber"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 513
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNACLRuleAllowReturnTCPPriv/Properties/RuleNumber should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 553
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 549
             },
+            "Path": [
+                "Resources",
+                "rNatInstanceTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 549
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 23,
                 "LineNumber": 553
@@ -1426,23 +1501,24 @@
                 "rNatInstanceTemplate",
                 "Properties",
                 "TimeoutInMinutes"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 553
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rNatInstanceTemplate/Properties/TimeoutInMinutes should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 623
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 623
@@ -1454,23 +1530,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 623
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupMgmtBastion/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 625
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 625
@@ -1482,23 +1559,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 625
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupMgmtBastion/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 641
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 641
@@ -1510,23 +1588,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 641
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupSSHFromProd/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 643
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 643
@@ -1538,23 +1617,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 643
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupSSHFromProd/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 659
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 659
@@ -1566,23 +1646,24 @@
                 "SecurityGroupIngress",
                 0,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 659
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupVpcNat/Properties/SecurityGroupIngress/0/FromPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 661
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 661
@@ -1594,23 +1675,24 @@
                 "SecurityGroupIngress",
                 0,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 661
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupVpcNat/Properties/SecurityGroupIngress/0/ToPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 664
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 664
@@ -1622,23 +1704,24 @@
                 "SecurityGroupIngress",
                 1,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 664
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupVpcNat/Properties/SecurityGroupIngress/1/FromPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 666
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 666
@@ -1650,23 +1733,24 @@
                 "SecurityGroupIngress",
                 1,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 666
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rSecurityGroupVpcNat/Properties/SecurityGroupIngress/1/ToPort should be of type Integer",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 680
-            },
             "End": {
                 "ColumnNumber": 25,
                 "LineNumber": 680
@@ -1676,23 +1760,24 @@
                 "rVPCProduction",
                 "Properties",
                 "EnableDnsHostnames"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 680
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rVPCProduction/Properties/EnableDnsHostnames should be of type Boolean",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values"
-        },
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_vpc_production.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 681
-            },
             "End": {
                 "ColumnNumber": 23,
                 "LineNumber": 681
@@ -1702,10 +1787,18 @@
                 "rVPCProduction",
                 "Properties",
                 "EnableDnsSupport"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 681
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/rVPCProduction/Properties/EnableDnsSupport should be of type Boolean",
-        "Filename": "test/templates/quickstart/nist_vpc_production.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     }
-]
\ No newline at end of file
+]
diff --git a/test/fixtures/results/quickstart/non_strict/nist_application.json b/test/fixtures/results/quickstart/non_strict/nist_application.json
--- a/test/fixtures/results/quickstart/non_strict/nist_application.json
+++ b/test/fixtures/results/quickstart/non_strict/nist_application.json
@@ -1,4 +1,58 @@
 [
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 95
+            },
+            "Path": [
+                "Outputs",
+                "LandingPageURL",
+                "Value",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 95
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 108
+            },
+            "Path": [
+                "Outputs",
+                "WebsiteURL",
+                "Value",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 108
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Warning",
@@ -7,6 +61,10 @@
                 "ColumnNumber": 10,
                 "LineNumber": 125
             },
+            "Path": [
+                "Parameters",
+                "pAppAmi"
+            ],
             "Start": {
                 "ColumnNumber": 3,
                 "LineNumber": 125
@@ -28,12 +86,16 @@
                 "ColumnNumber": 18,
                 "LineNumber": 182
             },
+            "Path": [
+                "Parameters",
+                "pManagementCIDR"
+            ],
             "Start": {
                 "ColumnNumber": 3,
                 "LineNumber": 182
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pManagementCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -49,12 +111,16 @@
                 "ColumnNumber": 18,
                 "LineNumber": 185
             },
+            "Path": [
+                "Parameters",
+                "pProductionCIDR"
+            ],
             "Start": {
                 "ColumnNumber": 3,
                 "LineNumber": 185
             }
         },
-        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: \"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$\"",
+        "Message": "AllowedPattern and/or AllowedValues for Parameter should be specified at Parameters/pProductionCIDR. Example for AllowedPattern: '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$'",
         "Rule": {
             "Description": "Check if a parameter is being used as a CIDR. If it is make sure it has allowed values regex comparisons",
             "Id": "W2509",
@@ -70,6 +136,10 @@
                 "ColumnNumber": 16,
                 "LineNumber": 213
             },
+            "Path": [
+                "Parameters",
+                "pWebServerAMI"
+            ],
             "Start": {
                 "ColumnNumber": 3,
                 "LineNumber": 213
@@ -91,6 +161,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 219
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 219
@@ -104,6 +179,226 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 236
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "copy_landing_content",
+                "sources",
+                "/var/www/html",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 15,
+                "LineNumber": 236
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 244
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "0-download-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 244
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 255
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "3-activate-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 255
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 264
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "install_cfn",
+                "files",
+                "/etc/cfn/cfn-hup.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 264
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 284
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "install_cfn",
+                "files",
+                "/etc/cfn/hooks.d/cfn-auto-reloader.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 284
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 324
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "install_wordpress",
+                "files",
+                "/tmp/create-wp-config",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 324
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 388
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigApp",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 388
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Warning",
@@ -112,6 +407,12 @@
                 "ColumnNumber": 14,
                 "LineNumber": 418
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 418
@@ -125,6 +426,131 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 430
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "0-download-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 430
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 441
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "installDeepSecurityAgent",
+                "commands",
+                "3-activate-DSA",
+                "command",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 441
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 450
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "nginx",
+                "files",
+                "/tmp/nginx/default.conf",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 450
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 520
+            },
+            "Path": [
+                "Resources",
+                "rAutoScalingConfigWeb",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 520
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Warning",
@@ -133,6 +559,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 577
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingGroupApp",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 577
@@ -154,6 +585,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 603
             },
+            "Path": [
+                "Resources",
+                "rAutoScalingGroupWeb",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 603
@@ -175,6 +611,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 698
             },
+            "Path": [
+                "Resources",
+                "rCWAlarmLowCPUWeb",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 698
@@ -196,6 +637,12 @@
                 "ColumnNumber": 23,
                 "LineNumber": 724
             },
+            "Path": [
+                "Resources",
+                "rELBApp",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 724
@@ -217,6 +664,12 @@
                 "ColumnNumber": 24,
                 "LineNumber": 725
             },
+            "Path": [
+                "Resources",
+                "rELBApp",
+                "DependsOn",
+                1
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 725
@@ -238,6 +691,12 @@
                 "ColumnNumber": 23,
                 "LineNumber": 760
             },
+            "Path": [
+                "Resources",
+                "rELBWeb",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 760
@@ -259,6 +718,12 @@
                 "ColumnNumber": 24,
                 "LineNumber": 761
             },
+            "Path": [
+                "Resources",
+                "rELBWeb",
+                "DependsOn",
+                1
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 761
@@ -272,6 +737,67 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 813
+            },
+            "Path": [
+                "Resources",
+                "rPostProcInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 813
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 23,
+                "LineNumber": 923
+            },
+            "Path": [
+                "Resources",
+                "rPostProcInstance",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join",
+                1,
+                44,
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 15,
+                "LineNumber": 923
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Warning",
@@ -280,6 +806,12 @@
                 "ColumnNumber": 21,
                 "LineNumber": 1004
             },
+            "Path": [
+                "Resources",
+                "rRDSInstanceMySQL",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 1004
@@ -301,6 +833,12 @@
                 "ColumnNumber": 24,
                 "LineNumber": 1005
             },
+            "Path": [
+                "Resources",
+                "rRDSInstanceMySQL",
+                "DependsOn",
+                1
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 1005
@@ -314,6 +852,37 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 1042
+            },
+            "Path": [
+                "Resources",
+                "rS3AccessLogsPolicy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 1042
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
         "Level": "Warning",
@@ -322,6 +891,13 @@
                 "ColumnNumber": 16,
                 "LineNumber": 1057
             },
+            "Path": [
+                "Resources",
+                "rS3AccessLogsPolicy",
+                "Properties",
+                "PolicyDocument",
+                "Version"
+            ],
             "Start": {
                 "ColumnNumber": 9,
                 "LineNumber": 1057
@@ -343,12 +919,17 @@
                 "ColumnNumber": 14,
                 "LineNumber": 1197
             },
+            "Path": [
+                "Resources",
+                "rWebContentS3Policy",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 1197
             }
         },
-        "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/0/Resource/Fn::Join/1/3/Ref/rWebContentBucket",
+        "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/Bucket/Ref/rWebContentBucket",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -364,12 +945,17 @@
                 "ColumnNumber": 14,
                 "LineNumber": 1197
             },
+            "Path": [
+                "Resources",
+                "rWebContentS3Policy",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 1197
             }
         },
-        "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/1/Resource/Fn::Join/1/3/Ref/rWebContentBucket",
+        "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/0/Resource/Fn::Join/1/3/Ref/rWebContentBucket",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -385,17 +971,84 @@
                 "ColumnNumber": 14,
                 "LineNumber": 1197
             },
+            "Path": [
+                "Resources",
+                "rWebContentS3Policy",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 1197
             }
         },
-        "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/Bucket/Ref/rWebContentBucket",
+        "Message": "Obsolete DependsOn on resource (rWebContentBucket), dependency already enforced by a \"Ref\" at Resources/rWebContentS3Policy/Properties/PolicyDocument/Statement/1/Resource/Fn::Join/1/3/Ref/rWebContentBucket",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 1210
+            },
+            "Path": [
+                "Resources",
+                "rWebContentS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                0,
+                "Resource",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 1210
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_application.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 21,
+                "LineNumber": 1227
+            },
+            "Path": [
+                "Resources",
+                "rWebContentS3Policy",
+                "Properties",
+                "PolicyDocument",
+                "Statement",
+                1,
+                "Resource",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 13,
+                "LineNumber": 1227
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     }
 ]
diff --git a/test/fixtures/results/quickstart/non_strict/nist_high_master.json b/test/fixtures/results/quickstart/non_strict/nist_high_master.json
--- a/test/fixtures/results/quickstart/non_strict/nist_high_master.json
+++ b/test/fixtures/results/quickstart/non_strict/nist_high_master.json
@@ -7,6 +7,10 @@
                 "ColumnNumber": 30,
                 "LineNumber": 11
             },
+            "Path": [
+                "Conditions",
+                "LoadConfigRulesTemplateAuto"
+            ],
             "Start": {
                 "ColumnNumber": 3,
                 "LineNumber": 11
@@ -28,12 +32,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetB']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetA']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -49,12 +59,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetA']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetB']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -70,12 +86,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetB']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetA']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -91,12 +113,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetA']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDBPrivateSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDBPrivateSubnetB']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -112,12 +140,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetB']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetA']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -133,12 +167,18 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 278
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pAppPrivateSubnetA/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rAppPrivateSubnetA']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ApplicationTemplate/Properties/Parameters/pDMZSubnetB/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rDMZSubnetB']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -154,6 +194,12 @@
                 "ColumnNumber": 28,
                 "LineNumber": 278
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 278
@@ -175,6 +221,12 @@
                 "ColumnNumber": 28,
                 "LineNumber": 279
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                1
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 279
@@ -196,6 +248,12 @@
                 "ColumnNumber": 28,
                 "LineNumber": 279
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "DependsOn",
+                1
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 279
@@ -217,6 +275,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 293
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pAppPrivateSubnetA",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 293
@@ -238,6 +304,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 297
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pAppPrivateSubnetB",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 297
@@ -259,6 +333,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 311
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pDBPrivateSubnetA",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 311
@@ -280,6 +362,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 315
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pDBPrivateSubnetB",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 315
@@ -301,6 +391,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 320
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pDMZSubnetA",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 320
@@ -322,6 +420,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 324
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pDMZSubnetB",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 324
@@ -343,6 +449,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 345
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pProductionVPC",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 345
@@ -364,6 +478,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 353
             },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "Parameters",
+                "pSecurityAlarmTopic",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 353
@@ -377,6 +499,118 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 377
+            },
+            "Path": [
+                "Resources",
+                "ApplicationTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 377
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 401
+            },
+            "Path": [
+                "Resources",
+                "ConfigRulesTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 401
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 414
+            },
+            "Path": [
+                "Resources",
+                "IamTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 414
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 435
+            },
+            "Path": [
+                "Resources",
+                "LoggingTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 435
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
         "Level": "Warning",
@@ -385,12 +619,17 @@
                 "ColumnNumber": 14,
                 "LineNumber": 445
             },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 445
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rRouteTableProdPublic']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rVPCProduction']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -406,6 +645,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 445
             },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 445
@@ -427,12 +671,17 @@
                 "ColumnNumber": 14,
                 "LineNumber": 445
             },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 445
             }
         },
-        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pProductionVPC/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rVPCProduction']",
+        "Message": "Obsolete DependsOn on resource (ProductionVpcTemplate), dependency already enforced by a \"Fn:GetAtt\" at Resources/ManagementVpcTemplate/Properties/Parameters/pRouteTableProdPublic/Fn::GetAtt/['ProductionVpcTemplate', 'Outputs.rRouteTableProdPublic']",
         "Rule": {
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
             "Id": "W3005",
@@ -448,6 +697,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 490
             },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "Properties",
+                "Parameters",
+                "pProductionVPC",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 490
@@ -469,6 +726,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 498
             },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "Properties",
+                "Parameters",
+                "pRouteTableProdPrivate",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 498
@@ -490,6 +755,14 @@
                 "ColumnNumber": 21,
                 "LineNumber": 502
             },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "Properties",
+                "Parameters",
+                "pRouteTableProdPublic",
+                "Fn::GetAtt"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 502
@@ -502,5 +775,61 @@
             "ShortDescription": "Ref/GetAtt to resource that is available when conditions are applied",
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html"
         }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 516
+            },
+            "Path": [
+                "Resources",
+                "ManagementVpcTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 516
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/nist_high_master.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 570
+            },
+            "Path": [
+                "Resources",
+                "ProductionVpcTemplate",
+                "Properties",
+                "TemplateURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 570
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     }
 ]
diff --git a/test/fixtures/results/quickstart/non_strict/openshift.json b/test/fixtures/results/quickstart/non_strict/openshift.json
--- a/test/fixtures/results/quickstart/non_strict/openshift.json
+++ b/test/fixtures/results/quickstart/non_strict/openshift.json
@@ -7,6 +7,10 @@
                 "ColumnNumber": 18,
                 "LineNumber": 25
             },
+            "Path": [
+                "Mappings",
+                "LinuxAMINameMap"
+            ],
             "Start": {
                 "ColumnNumber": 3,
                 "LineNumber": 25
@@ -20,6 +24,60 @@
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 126
+            },
+            "Path": [
+                "Outputs",
+                "ContainerAccessELBName",
+                "Value",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 126
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 135
+            },
+            "Path": [
+                "Outputs",
+                "OpenShiftUI",
+                "Value",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 135
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Warning",
@@ -28,6 +86,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 283
             },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 283
@@ -49,6 +112,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 283
             },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 283
@@ -62,6 +130,99 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 304
+            },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 304
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 327
+            },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "SetPrivateKey",
+                "files",
+                "/root/.ssh/id_rsa",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 327
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 377
+            },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 377
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Warning",
@@ -70,6 +231,12 @@
                 "ColumnNumber": 13,
                 "LineNumber": 775
             },
+            "Path": [
+                "Resources",
+                "GetRSA",
+                "DependsOn",
+                0
+            ],
             "Start": {
                 "ColumnNumber": 7,
                 "LineNumber": 775
@@ -83,6 +250,63 @@
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 780
+            },
+            "Path": [
+                "Resources",
+                "GetRSA",
+                "Properties",
+                "ResourceProperties",
+                "RequestId",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 780
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 786
+            },
+            "Path": [
+                "Resources",
+                "GetRSA",
+                "Properties",
+                "ResponseURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 786
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Warning",
@@ -91,6 +315,14 @@
                 "ColumnNumber": 18,
                 "LineNumber": 804
             },
+            "Path": [
+                "Resources",
+                "KeyGen",
+                "Properties",
+                "Code",
+                "S3Key",
+                "Fn::Sub"
+            ],
             "Start": {
                 "ColumnNumber": 11,
                 "LineNumber": 804
@@ -104,6 +336,67 @@
             "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
         }
     },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 872
+            },
+            "Path": [
+                "Resources",
+                "OpenShiftEtcdLaunchConfig",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 872
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 922
+            },
+            "Path": [
+                "Resources",
+                "OpenShiftEtcdLaunchConfig",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 922
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
     {
         "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
         "Level": "Warning",
@@ -112,6 +405,11 @@
                 "ColumnNumber": 14,
                 "LineNumber": 1085
             },
+            "Path": [
+                "Resources",
+                "OpenShiftMasterASLaunchConfig",
+                "DependsOn"
+            ],
             "Start": {
                 "ColumnNumber": 5,
                 "LineNumber": 1085
@@ -124,5 +422,127 @@
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
         }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 1097
+            },
+            "Path": [
+                "Resources",
+                "OpenShiftMasterASLaunchConfig",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 1097
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 1147
+            },
+            "Path": [
+                "Resources",
+                "OpenShiftMasterASLaunchConfig",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1147
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 1426
+            },
+            "Path": [
+                "Resources",
+                "OpenShiftNodesLaunchConfig",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 1426
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 1481
+            },
+            "Path": [
+                "Resources",
+                "OpenShiftNodesLaunchConfig",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1481
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     }
 ]
diff --git a/test/fixtures/results/quickstart/openshift.json b/test/fixtures/results/quickstart/openshift.json
--- a/test/fixtures/results/quickstart/openshift.json
+++ b/test/fixtures/results/quickstart/openshift.json
@@ -1,16 +1,8 @@
 [
     {
-        "Rule": {
-            "Id": "W7001",
-            "Description": "Making sure the mappings defined are used",
-            "ShortDescription": "Check if Mappings are Used",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 3,
-                "LineNumber": 25
-            },
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 25
@@ -18,24 +10,78 @@
             "Path": [
                 "Mappings",
                 "LinuxAMINameMap"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 3,
+                "LineNumber": 25
+            }
         },
-        "Level": "Warning",
-        "Message": "Mapping LinuxAMINameMap not used",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Message": "Mapping 'LinuxAMINameMap' is defined but not used",
+        "Rule": {
+            "Description": "Making sure the mappings defined are used",
+            "Id": "W7001",
+            "ShortDescription": "Check if Mappings are Used",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 126
+            },
+            "Path": [
+                "Outputs",
+                "ContainerAccessELBName",
+                "Value",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 283
+                "ColumnNumber": 7,
+                "LineNumber": 126
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 15,
+                "LineNumber": 135
             },
+            "Path": [
+                "Outputs",
+                "OpenShiftUI",
+                "Value",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 135
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 283
@@ -44,24 +90,24 @@
                 "Resources",
                 "AnsibleConfigServer",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 283
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (OpenShiftNodeASG), dependency already enforced by a \"Ref\" at Resources/AnsibleConfigServer/Properties/UserData/Fn::Base64/Fn::Join/1/43/Ref/OpenShiftNodeASG",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "W3005",
             "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
             "ShortDescription": "Check obsolete DependsOn configuration for Resources",
             "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 283
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 283
@@ -70,24 +116,88 @@
                 "Resources",
                 "AnsibleConfigServer",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 283
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (OpenShiftNodeASG), dependency already enforced by a \"Ref\" at Resources/AnsibleConfigServer/Properties/UserData/Fn::Base64/Fn::Join/1/88/Ref/OpenShiftNodeASG",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 304
+            },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
             "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 365
+                "ColumnNumber": 17,
+                "LineNumber": 304
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 327
             },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "SetPrivateKey",
+                "files",
+                "/root/.ssh/id_rsa",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 327
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 33,
                 "LineNumber": 365
@@ -99,24 +209,24 @@
                 "NetworkInterfaces",
                 0,
                 "AssociatePublicIpAddress"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 365
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/AnsibleConfigServer/Properties/NetworkInterfaces/0/AssociatePublicIpAddress should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 366
-            },
             "End": {
                 "ColumnNumber": 28,
                 "LineNumber": 366
@@ -128,51 +238,137 @@
                 "NetworkInterfaces",
                 0,
                 "DeleteOnTermination"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 366
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/AnsibleConfigServer/Properties/NetworkInterfaces/0/DeleteOnTermination should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 775
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 377
             },
+            "Path": [
+                "Resources",
+                "AnsibleConfigServer",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 377
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 13,
-                "LineNumber": 75
+                "LineNumber": 775
             },
             "Path": [
                 "Resources",
                 "GetRSA",
                 "DependsOn",
                 0
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 775
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (KeyGen), dependency already enforced by a \"Fn:GetAtt\" at Resources/GetRSA/Properties/ServiceToken/Fn::GetAtt/['KeyGen', 'Arn']",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "W1020",
-            "Description": "Checks sub strings to see if a variable is defined.",
-            "ShortDescription": "Sub isn't needed if it doesn't have a variable defined",
-            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 780
+            },
+            "Path": [
+                "Resources",
+                "GetRSA",
+                "Properties",
+                "ResourceProperties",
+                "RequestId",
+                "Fn::Join"
+            ],
             "Start": {
                 "ColumnNumber": 11,
-                "LineNumber": 804
+                "LineNumber": 780
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
+        "Location": {
+            "End": {
+                "ColumnNumber": 17,
+                "LineNumber": 786
             },
+            "Path": [
+                "Resources",
+                "GetRSA",
+                "Properties",
+                "ResponseURL",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 786
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Warning",
+        "Location": {
             "End": {
                 "ColumnNumber": 18,
                 "LineNumber": 804
@@ -184,24 +380,24 @@
                 "Code",
                 "S3Key",
                 "Fn::Sub"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 804
+            }
         },
-        "Level": "Warning",
         "Message": "Fn::Sub isn't needed because there are no variables at Resources/KeyGen/Properties/Code/S3Key/Fn::Sub",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Rule": {
+            "Description": "Checks sub strings to see if a variable is defined.",
+            "Id": "W1020",
+            "ShortDescription": "Sub isn't needed if it doesn't have a variable defined",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 811
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 811
@@ -211,24 +407,24 @@
                 "KeyGen",
                 "Properties",
                 "Timeout"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 811
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/KeyGen/Properties/Timeout should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 853
-            },
             "End": {
                 "ColumnNumber": 26,
                 "LineNumber": 853
@@ -240,24 +436,56 @@
                 "Tags",
                 0,
                 "PropagateAtLaunch"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 853
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftEtcdASG/Properties/Tags/0/PropagateAtLaunch should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 905
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 872
             },
+            "Path": [
+                "Resources",
+                "OpenShiftEtcdLaunchConfig",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 872
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 21,
                 "LineNumber": 905
@@ -270,24 +498,24 @@
                 0,
                 "Ebs",
                 "VolumeSize"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 905
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftEtcdLaunchConfig/Properties/BlockDeviceMappings/0/Ebs/VolumeSize should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 913
-            },
             "End": {
                 "ColumnNumber": 25,
                 "LineNumber": 913
@@ -297,24 +525,53 @@
                 "OpenShiftEtcdLaunchConfig",
                 "Properties",
                 "InstanceMonitoring"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 913
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftEtcdLaunchConfig/Properties/InstanceMonitoring should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1077
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 922
             },
+            "Path": [
+                "Resources",
+                "OpenShiftEtcdLaunchConfig",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 922
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 26,
                 "LineNumber": 1077
@@ -326,24 +583,24 @@
                 "Tags",
                 0,
                 "PropagateAtLaunch"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1077
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftMasterASG/Properties/Tags/0/PropagateAtLaunch should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     },
     {
-        "Rule": {
-            "Id": "W3005",
-            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
-            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
-            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Warning",
         "Location": {
-            "Start": {
-                "ColumnNumber": 5,
-                "LineNumber": 1085
-            },
             "End": {
                 "ColumnNumber": 14,
                 "LineNumber": 1085
@@ -352,24 +609,56 @@
                 "Resources",
                 "OpenShiftMasterASLaunchConfig",
                 "DependsOn"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 5,
+                "LineNumber": 1085
+            }
         },
-        "Level": "Warning",
         "Message": "Obsolete DependsOn on resource (GetRSA), dependency already enforced by a \"Fn:GetAtt\" at Resources/OpenShiftMasterASLaunchConfig/Metadata/AWS::CloudFormation::Init/GetPublicKey/files//root/.ssh/public.key/content/Fn::Join/1/1/Fn::GetAtt/['GetRSA', 'PUB']",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Rule": {
+            "Description": "Check if DependsOn is specified if not needed. A Ref or a Fn::GetAtt already is an implicit dependency.",
+            "Id": "W3005",
+            "ShortDescription": "Check obsolete DependsOn configuration for Resources",
+            "Source": "https://aws.amazon.com/blogs/devops/optimize-aws-cloudformation-templates/"
+        }
     },
     {
-        "Rule": {
-            "Id": "E3012",
-            "Description": "Checks resource property values with Primitive Types for values that match those types.",
-            "ShortDescription": "Check resource properties values",
-            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1130
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 1097
             },
+            "Path": [
+                "Resources",
+                "OpenShiftMasterASLaunchConfig",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 1097
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 21,
                 "LineNumber": 1130
@@ -382,24 +671,24 @@
                 0,
                 "Ebs",
                 "VolumeSize"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1130
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftMasterASLaunchConfig/Properties/BlockDeviceMappings/0/Ebs/VolumeSize should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 1138
-            },
             "End": {
                 "ColumnNumber": 25,
                 "LineNumber": 1138
@@ -409,24 +698,53 @@
                 "OpenShiftMasterASLaunchConfig",
                 "Properties",
                 "InstanceMonitoring"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 1138
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftMasterASLaunchConfig/Properties/InstanceMonitoring should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1362
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 1147
             },
+            "Path": [
+                "Resources",
+                "OpenShiftMasterASLaunchConfig",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1147
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 26,
                 "LineNumber": 1362
@@ -438,24 +756,24 @@
                 "Tags",
                 0,
                 "PropagateAtLaunch"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1362
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodeASG/Properties/Tags/0/PropagateAtLaunch should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1403
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1403
@@ -467,24 +785,24 @@
                 "SecurityGroupIngress",
                 1,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1403
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodeSecurityGroup/Properties/SecurityGroupIngress/1/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1405
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1405
@@ -496,24 +814,24 @@
                 "SecurityGroupIngress",
                 1,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1405
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodeSecurityGroup/Properties/SecurityGroupIngress/1/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1408
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1408
@@ -525,24 +843,24 @@
                 "SecurityGroupIngress",
                 2,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1408
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodeSecurityGroup/Properties/SecurityGroupIngress/2/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1410
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1410
@@ -554,24 +872,56 @@
                 "SecurityGroupIngress",
                 2,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1410
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodeSecurityGroup/Properties/SecurityGroupIngress/2/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1459
+            "End": {
+                "ColumnNumber": 25,
+                "LineNumber": 1426
             },
+            "Path": [
+                "Resources",
+                "OpenShiftNodesLaunchConfig",
+                "Metadata",
+                "AWS::CloudFormation::Init",
+                "GetPublicKey",
+                "files",
+                "/root/.ssh/public.key",
+                "content",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 17,
+                "LineNumber": 1426
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 21,
                 "LineNumber": 1459
@@ -584,24 +934,24 @@
                 0,
                 "Ebs",
                 "VolumeSize"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1459
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodesLaunchConfig/Properties/BlockDeviceMappings/0/Ebs/VolumeSize should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 11,
-                "LineNumber": 1463
-            },
             "End": {
                 "ColumnNumber": 21,
                 "LineNumber": 1463
@@ -614,24 +964,24 @@
                 1,
                 "Ebs",
                 "VolumeSize"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1463
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodesLaunchConfig/Properties/BlockDeviceMappings/1/Ebs/VolumeSize should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 7,
-                "LineNumber": 1472
-            },
             "End": {
                 "ColumnNumber": 25,
                 "LineNumber": 1472
@@ -641,24 +991,53 @@
                 "OpenShiftNodesLaunchConfig",
                 "Properties",
                 "InstanceMonitoring"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 7,
+                "LineNumber": 1472
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftNodesLaunchConfig/Properties/InstanceMonitoring should be of type Boolean",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Informational",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1645
+            "End": {
+                "ColumnNumber": 19,
+                "LineNumber": 1481
             },
+            "Path": [
+                "Resources",
+                "OpenShiftNodesLaunchConfig",
+                "Properties",
+                "UserData",
+                "Fn::Base64",
+                "Fn::Join"
+            ],
+            "Start": {
+                "ColumnNumber": 11,
+                "LineNumber": 1481
+            }
+        },
+        "Message": "Prefer using Fn::Sub over Fn::Join with an empty delimiter",
+        "Rule": {
+            "Description": "Prefer a sub instead of Join when using a join string that is empty",
+            "Id": "I1022",
+            "ShortDescription": "Use Sub instead of Join",
+            "Source": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html"
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
+        "Location": {
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1645
@@ -670,24 +1049,24 @@
                 "SecurityGroupIngress",
                 1,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1645
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftSecurityGroup/Properties/SecurityGroupIngress/1/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1647
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1647
@@ -699,24 +1078,24 @@
                 "SecurityGroupIngress",
                 1,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1647
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftSecurityGroup/Properties/SecurityGroupIngress/1/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1650
-            },
             "End": {
                 "ColumnNumber": 17,
                 "LineNumber": 1650
@@ -728,24 +1107,24 @@
                 "SecurityGroupIngress",
                 2,
                 "FromPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1650
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftSecurityGroup/Properties/SecurityGroupIngress/2/FromPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
-    },
-    {
         "Rule": {
-            "Id": "E3012",
             "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
             "ShortDescription": "Check resource properties values",
             "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
-        },
+        }
+    },
+    {
+        "Filename": "test/fixtures/templates/quickstart/openshift.yaml",
+        "Level": "Error",
         "Location": {
-            "Start": {
-                "ColumnNumber": 9,
-                "LineNumber": 1652
-            },
             "End": {
                 "ColumnNumber": 15,
                 "LineNumber": 1652
@@ -757,10 +1136,18 @@
                 "SecurityGroupIngress",
                 2,
                 "ToPort"
-            ]
+            ],
+            "Start": {
+                "ColumnNumber": 9,
+                "LineNumber": 1652
+            }
         },
-        "Level": "Error",
         "Message": "Property Resources/OpenShiftSecurityGroup/Properties/SecurityGroupIngress/2/ToPort should be of type Integer",
-        "Filename": "test/fixtures/templates/quickstart/openshift.yaml"
+        "Rule": {
+            "Description": "Checks resource property values with Primitive Types for values that match those types.",
+            "Id": "E3012",
+            "ShortDescription": "Check resource properties values",
+            "Source": "https://github.com/aws-cloudformation/cfn-python-lint/blob/master/docs/cfn-resource-specification.md#valueprimitivetype"
+        }
     }
-]
\ No newline at end of file
+]
diff --git a/test/fixtures/templates/bad/functions/subnotjoin.yaml b/test/fixtures/templates/bad/functions/subnotjoin.yaml
new file mode 100644
--- /dev/null
+++ b/test/fixtures/templates/bad/functions/subnotjoin.yaml
@@ -0,0 +1,24 @@
+---
+AWSTemplateFormatVersion: "2010-09-09"
+Description: >
+  Test Sub Over Join
+Parameters:
+  myPackage:
+    Type: String
+    Default: httpd
+    Description: Web Package
+  myAppPackage:
+    Type: String
+    Default: java
+    Description: App Package
+Resources:
+  myInstance:
+    Type: AWS::EC2::Instance
+    Properties:
+      ImageId: String
+      UserData:
+        Fn::Base64:
+          Fn::Join:
+          - ''
+          - - !Sub 'yum install ${myPackage}'
+            - !Sub 'yum install ${myAppPackage}'
\ No newline at end of file
diff --git a/test/fixtures/templates/good/functions/subnotjoin.yaml b/test/fixtures/templates/good/functions/subnotjoin.yaml
new file mode 100644
--- /dev/null
+++ b/test/fixtures/templates/good/functions/subnotjoin.yaml
@@ -0,0 +1,23 @@
+---
+AWSTemplateFormatVersion: "2010-09-09"
+Description: >
+  Test Sub Over Join
+Parameters:
+  myPackage:
+    Type: String
+    Default: httpd
+    Description: Web Package
+  myAppPackage:
+    Type: String
+    Default: java
+    Description: App Package
+Resources:
+  myInstance:
+    Type: AWS::EC2::Instance
+    Properties:
+      ImageId: String
+      UserData:
+        Fn::Base64:
+          Fn::Sub: |
+            yum install ${myPackage}
+            yum install ${myAppPackage}
\ No newline at end of file
diff --git a/test/fixtures/templates/good/generic.yaml b/test/fixtures/templates/good/generic.yaml
--- a/test/fixtures/templates/good/generic.yaml
+++ b/test/fixtures/templates/good/generic.yaml
@@ -139,11 +139,7 @@ Resources:
         Protocol: HTTP
       HealthCheck:
         Target:
-          Fn::Join:
-          - ''
-          - - 'HTTP:'
-            - Ref: WebServerPort
-            - "/"
+          Fn::Sub: 'HTTP:${WebServerPort}/'
         HealthyThreshold: '3'
         UnhealthyThreshold: '5'
         Interval: '30'
diff --git a/test/integration/test_quickstart_templates.py b/test/integration/test_quickstart_templates.py
--- a/test/integration/test_quickstart_templates.py
+++ b/test/integration/test_quickstart_templates.py
@@ -39,7 +39,7 @@ def setUp(self):
             },
             'watchmaker': {
                 "filename": 'test/fixtures/templates/public/watchmaker.json',
-                "failures": 0
+                "results_filename": 'test/fixtures/results/public/watchmaker.json'
             },
             'nist_high_master': {
                 'filename': 'test/fixtures/templates/quickstart/nist_high_master.yaml',
diff --git a/test/rules/functions/test_sub_not_join.py b/test/rules/functions/test_sub_not_join.py
new file mode 100644
--- /dev/null
+++ b/test/rules/functions/test_sub_not_join.py
@@ -0,0 +1,37 @@
+"""
+  Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+
+  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.
+
+  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.
+"""
+from cfnlint.rules.functions.SubNotJoin import SubNotJoin  # pylint: disable=E0401
+from .. import BaseRuleTestCase
+
+
+class TestSubNotJoin(BaseRuleTestCase):
+    """Test Rules Get Att """
+    def setUp(self):
+        """Setup"""
+        super(TestSubNotJoin, self).setUp()
+        self.collection.register(SubNotJoin())
+        self.success_templates = [
+            'test/fixtures/templates/good/functions/subnotjoin.yaml',
+        ]
+
+    def test_file_positive(self):
+        """Test Positive"""
+        self.helper_file_positive()
+
+    def test_file_negative(self):
+        """Test failure"""
+        self.helper_file_negative('test/fixtures/templates/bad/functions/subnotjoin.yaml', 1)