diff --git a/meta/lib/oe/license.py b/meta/lib/oe/license.py
index 3c15db782f..223f98acd5 100644
--- a/meta/lib/oe/license.py
+++ b/meta/lib/oe/license.py
@@ -47,9 +47,9 @@ class InvalidLicense(LicenseError):
     def __str__(self):
         return "invalid characters in license '%s'" % self.license

-license_operator_chars = '&|() '
+license_operator_chars = '&|()+ '
 license_operator = re.compile(r'([' + license_operator_chars + '])')
-license_pattern = re.compile(r'[a-zA-Z0-9.+_\-]+$')
+license_pattern = re.compile(r'[a-zA-Z0-9._\-]+$')

 class LicenseVisitor(ast.NodeVisitor):
     """Get elements based on OpenEmbedded license strings"""
diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
index 5aeed5cd6f..17a1ce44e7 100644
--- a/meta/lib/oe/spdx30_tasks.py
+++ b/meta/lib/oe/spdx30_tasks.py
@@ -97,6 +97,9 @@ def add_license_expression(d, objset, license_expression,
license_data):
         if l == "|":
             return "OR"

+        if l == "+":
+            return "WITH"
+
         if l == "CLOSED":
             return "NONE"
@@ -115,6 +118,7 @@ def add_license_expression(d, objset,
license_expression, license_data):
         .replace(")", " ) ")
         .replace("|", " | ")
         .replace("&", " & ")
+        .replace("+", " + ")
         .split()
     )
