diff --git a/PythonImproved.YAML-tmLanguage b/PythonImproved.YAML-tmLanguage
index 9f80579..4660b9f 100644
--- a/PythonImproved.YAML-tmLanguage
+++ b/PythonImproved.YAML-tmLanguage
@@ -45,10 +45,6 @@ patterns:
   captures:
     '1': {name: punctuation.definition.comment.python}
 
-- name: constant.other.allcaps.python
-  match: \b([A-Z_][A-Z0-9_]*)\b(?![\.|\(])
-  comment: Match identifiers in ALL_CAPS as constants.
-
 - name: constant.numeric.integer.long.hexadecimal.python
   match: \b(?i:(0x\h*)L)
 
@@ -101,7 +97,7 @@ patterns:
 
 - comment: keywords that haven't fit into other groups (yet).
   name: keyword.other.python
-  match: \b(assert)\b
+  match: \b(assert|del)\b
 
 - name: invalid.deprecated.operator.python
   match: <>
@@ -244,37 +240,37 @@ patterns:
         '2': {name: punctuation.separator.parameters.python}
 
 - comment: a decorator may be a function call which returns a decorator.
-  name: meta.function.decorator.python
-  begin: ^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\()
-  end: (\))
-  endCaptures:
-    '1': {name: punctuation.definition.arguments.end.python}
+  name: meta.function.decorator-call.python
+  contentName: entity.name.function.decorator.python
+  begin: ^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[A-Za-z_][A-Za-z_0-9]*)*\s*\()
+  end: (?<=\))
   patterns:
-  - contentName: entity.name.function.decorator.python
-    begin: (?=(@)\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\()
+  - begin: '@'
     beginCaptures:
-      '1': {name: punctuation.definition.decorator.python}
-    end: (?=\s*\()
+      '0': {name: punctuation.definition.decorator.python}
+    end: (?=\()
     patterns:
     - include: '#dotted_name'
   - contentName: meta.function.decorator.arguments.python
-    begin: (\()
+    begin: \(
     beginCaptures:
-      '1': {name: punctuation.definition.arguments.begin.python}
-    end: (?=\))
+      '0': {name: punctuation.definition.arguments.begin.python}
+    end: \)
+    endCaptures:
+      '0': {name: punctuation.definition.arguments.end.python}
     patterns:
     - include: '#keyword_arguments'
     - include: $self
 
 - name: meta.function.decorator.python
   contentName: entity.name.function.decorator.python
-  begin: ^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*)
-  end: (?=\s|$\n?|#)
+  begin: ^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[a-zA-Z_][a-zA-Z_0-9]*)*)
+  end: (?=\s*(#|$))
   patterns:
-  - begin: (?=(@)\s*[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*)
+  - begin: '@'
     beginCaptures:
-      '1': {name: punctuation.definition.decorator.python}
-    end: (?=\s|$\n?|#)
+      '0': {name: punctuation.definition.decorator.python}
+    end: (?=\s*(#|$))
     patterns:
     - include: '#dotted_name'
 
@@ -290,34 +286,16 @@ patterns:
   - include: '#keyword_arguments'
   - include: $self
 
-- include: '#builtin_functions'
-
-- include: '#builtin_types'
-
-- include: '#builtin_exceptions'
-
 - include: '#docstrings'
 
-- include: '#magic_function_names'
-
-- include: '#magic_variable_names'
-
-- include: '#language_variables'
-
-- include: '#generic_object_names'
+# - include: '#generic_object_names'
 
 - name: meta.function-call.python
-  begin: (?:\.)?([a-zA-Z_][a-zA-Z_0-9]*)\s*(?=\()
-  beginCaptures:
-    '1': {name: meta.function-call.generic.python}
+  begin: (?=\b[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[A-Za-z_][A-Za-z0-9_]*)*\s*\()
   end: (\))
   endCaptures:
     '1': {name: punctuation.definition.arguments.end.python}
   patterns:
-  - begin: (?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\()
-    end: (?=\s*\()
-    patterns:
-    - include: '#dotted_name'
   - contentName: meta.function-call.arguments.python
     begin: (\()
     beginCaptures:
@@ -326,17 +304,21 @@ patterns:
     patterns:
     - include: '#keyword_arguments'
     - include: $self
+  - begin: \G
+    end: (?=\()
+    patterns:
+    - include: '#dotted_name'
+
+- comment: Py2 print statement that should only be matched after function calls
+  name: keyword.other.print.python
+  match: \b(print)(?=\s)(?!\s*[.,]) # Otherwise this would qualify as a dotted name, which is matched later
 
 - name: meta.item-access.python
-  begin: (?=[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\[)
+  begin: (?=[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[a-zA-Z_][a-zA-Z_0-9]*)*\s*\[)
   end: (\])
   endCaptures:
     '1': {name: punctuation.definition.arguments.end.python}
   patterns:
-  - begin: (?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\[)
-    end: (?=\s*\[)
-    patterns:
-    - include: '#dotted_name'
   - contentName: meta.item-access.arguments.python
     begin: (\[)
     beginCaptures:
@@ -344,6 +326,10 @@ patterns:
     end: (?=\])
     patterns:
     - include: $self
+  - begin: \G
+    end: (?=\[)
+    patterns:
+    - include: '#dotted_name'
 
 - name: meta.item-access.python
   contentName: meta.item-access.arguments.python
@@ -366,8 +352,6 @@ patterns:
 
 - include: '#line_continuation'
 
-- include: '#language_variables'
-
 - name: constant.language.python
   match: \b(None|True|False|Ellipsis|NotImplemented)\b
 
@@ -375,7 +359,8 @@ patterns:
 
 - include: '#string_quoted_double'
 
-- include: '#dotted_name'
+- comment: Covers every (remaining) identifier
+  include: '#dotted_name'
 
 - match: \b(\[)(\s*(\]))\b
   captures:
@@ -453,6 +438,11 @@ patterns:
     - include: $self
 
 repository:
+  allcaps_constant:
+    name: constant.other.allcaps.python
+    match: \b([A-Z_][A-Z0-9_]*)\b(?![\.|\(])
+    comment: Match identifiers in ALL_CAPS as constants.
+
   annotated_arguments:
     begin: \b([a-zA-Z_][a-zA-Z_0-9]*)\s*(:)|(?=\()
     beginCaptures:
@@ -497,35 +487,12 @@ repository:
     match: \b((Arithmetic|Assertion|Attribute|Buffer|EOF|Environment|FloatingPoint|IO|Import|Indentation|Index|Key|Lookup|Memory|Name|NotImplemented|OS|Overflow|Reference|Runtime|Standard|Syntax|System|Tab|Type|UnboundLocal|Unicode(Encode|Decode|Translate)?|Value|VMS|Windows|ZeroDivision|([.a-zA-Z0-9_]+))Error|((Pending)?Deprecation|Runtime|Syntax|User|Future|Import|Unicode|Bytes)?Warning|SystemExit|StopIteration|NotImplemented|KeyboardInterrupt|GeneratorExit|([.a-zA-Z0-9_]+)?Exception)\b
 
   builtin_functions:
-    patterns:
-    - name: meta.function-call.python
-      begin: (?<!\.)(__import__|ascii|abs|all|any|apply|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|copyright|credits|del|delattr|dict|dir|divmod|enumerate|eval|exec|execfile|exit|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|license|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|print|property|quit|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unicode|unichr|vars|xrange|zip)\s*(?=\()
-      beginCaptures:
-        '1': {name: support.function.builtin.python}
-      end: (\))
-      endCaptures:
-        '1': {name: punctuation.definition.arguments.end.python}
-      patterns:
-      - begin: (?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\()
-        end: (?=\s*\()
-        patterns:
-        - include: '#dotted_name'
-      - begin: (\()
-        beginCaptures:
-          '1': {name: punctuation.definition.arguments.begin.python}
-        contentName: meta.function-call.arguments.python
-        end: (?=\))
-        patterns:
-        - include: '#keyword_arguments'
-        - include: $self
-    - comment: "These are statements in Py2, but don't really fit into keyword.control.flow\
-        \ with the rest"
-      name: support.function.builtin.python
-      match: (?<!\.)\b(print|del)\b
+    name: support.function.builtin.python
+    match: (?<!\.)\b(__import__|abs|all|any|apply|ascii|bin|buffer|callable|chr|cmp|coerce|compile|copyright|credits|delattr|dir|divmod|enumerate|eval|exec|execfile|exit|filter|format|getattr|globals|hasattr|hash|help|hex|id|input|intern|isinstance|issubclass|iter|len|license|locals|long|map|max|memoryview|min|next|oct|open|ord|pow|print|property|quit|range|raw_input|reduce|reload|repr|reversed|round|setattr|sorted|sum|unichr|vars|xrange|zip)\b
 
   builtin_types:
     name: support.type.python
-    match: (?<!\.)\b(ascii|basestring|bin|bool|buffer|bytearray|bytes|classmethod|complex|dict|file|float|frozenset|hex|int|list|long|object|oct|property|reversed|set|slice|staticmethod|str|super|tuple|type|unicode|xrange)\b
+    match: (?<!\.)\b(basestring|bool|bytearray|bytes|classmethod|complex|dict|file|float|frozenset|int|list|object|property|set|slice|staticmethod|str|super|tuple|type|unicode)\b
 
   character-class:
     patterns:
@@ -571,17 +538,21 @@ repository:
       - include: '#string_quoted_single'
 
   dotted_name:
-    begin: (?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)
-    end: (?![A-Za-z0-9_\.])
+    begin: (?=(?:\.\s*)?[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[A-Za-z_][A-Za-z0-9_]*)*)
+    end: (?![A-Za-z0-9_\.\s])|(?=(?<!\.)\s+[^.])|$
+    contentName: meta.dotted-name.python
     patterns:
-    - begin: (\.)(?=[A-Za-z_][A-Za-z0-9_]*)
+    - begin: \.
+      beginCaptures:
+        '0': {name: meta.dot.python}
       end: (?![A-Za-z0-9_])
       patterns:
       - include: '#magic_function_names'
       - include: '#magic_variable_names'
       - include: '#illegal_names'
+      - include: '#allcaps_constant'
       - include: '#generic_names'
-    - begin: (?<!\.)(?=[A-Za-z_][A-Za-z0-9_]*)
+    - begin: (?=[A-Za-z_])
       end: (?![A-Za-z0-9_])
       patterns:
       - include: '#builtin_functions'
@@ -591,6 +562,7 @@ repository:
       - include: '#magic_function_names'
       - include: '#magic_variable_names'
       - include: '#language_variables'
+      - include: '#allcaps_constant'
       - include: '#generic_names'
 
   entity_name_class:
@@ -628,16 +600,17 @@ repository:
       '2': {name: constant.character.escape.unicode.32-bit-hex.python}
       '3': {name: constant.character.escape.unicode.name.python}
 
-  function_name:
-    patterns:
-    - include: '#magic_function_names'
-    - include: '#magic_variable_names'
-    - include: '#builtin_exceptions'
-    - include: '#builtin_functions'
-    - include: '#builtin_types'
-    - include: '#generic_names'
+  # function_name:
+  #   patterns:
+  #   - include: '#magic_function_names'
+  #   - include: '#magic_variable_names'
+  #   - include: '#builtin_exceptions'
+  #   - include: '#builtin_functions'
+  #   - include: '#builtin_types'
+  #   - include: '#generic_names'
 
   generic_names:
+    name: meta.generic-name.python
     match: '[A-Za-z_][A-Za-z0-9_]*'
 
   generic_object_names:
@@ -1258,6 +1231,7 @@ repository:
     patterns:
     - include: '#string_quoted_double'
     - include: '#string_quoted_single'
+
 author: Matt Morrison @MattDMo mattdmo@pigimal.com
 bundleUUID: 11B0273F-0284-4483-B17B-4B8D0A9294CC
 firstLineMatch: ^#!/.*\bpython[0-9.-]*\b
diff --git a/PythonImproved.tmLanguage b/PythonImproved.tmLanguage
index 7ffdebe..dd7fbf9 100644
--- a/PythonImproved.tmLanguage
+++ b/PythonImproved.tmLanguage
@@ -127,14 +127,6 @@
 			<key>name</key>
 			<string>comment.line.number-sign.python</string>
 		</dict>
-		<dict>
-			<key>comment</key>
-			<string>Match identifiers in ALL_CAPS as constants.</string>
-			<key>match</key>
-			<string>\b([A-Z_][A-Z0-9_]*)\b(?![\.|\(])</string>
-			<key>name</key>
-			<string>constant.other.allcaps.python</string>
-		</dict>
 		<dict>
 			<key>match</key>
 			<string>\b(?i:(0x\h*)L)</string>
@@ -239,7 +231,7 @@
 			<key>comment</key>
 			<string>keywords that haven't fit into other groups (yet).</string>
 			<key>match</key>
-			<string>\b(assert)\b</string>
+			<string>\b(assert|del)\b</string>
 			<key>name</key>
 			<string>keyword.other.python</string>
 		</dict>
@@ -686,38 +678,30 @@
 		</dict>
 		<dict>
 			<key>begin</key>
-			<string>^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\()</string>
+			<string>^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[A-Za-z_][A-Za-z_0-9]*)*\s*\()</string>
 			<key>comment</key>
 			<string>a decorator may be a function call which returns a decorator.</string>
+			<key>contentName</key>
+			<string>entity.name.function.decorator.python</string>
 			<key>end</key>
-			<string>(\))</string>
-			<key>endCaptures</key>
-			<dict>
-				<key>1</key>
-				<dict>
-					<key>name</key>
-					<string>punctuation.definition.arguments.end.python</string>
-				</dict>
-			</dict>
+			<string>(?&lt;=\))</string>
 			<key>name</key>
-			<string>meta.function.decorator.python</string>
+			<string>meta.function.decorator-call.python</string>
 			<key>patterns</key>
 			<array>
 				<dict>
 					<key>begin</key>
-					<string>(?=(@)\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\()</string>
+					<string>@</string>
 					<key>beginCaptures</key>
 					<dict>
-						<key>1</key>
+						<key>0</key>
 						<dict>
 							<key>name</key>
 							<string>punctuation.definition.decorator.python</string>
 						</dict>
 					</dict>
-					<key>contentName</key>
-					<string>entity.name.function.decorator.python</string>
 					<key>end</key>
-					<string>(?=\s*\()</string>
+					<string>(?=\()</string>
 					<key>patterns</key>
 					<array>
 						<dict>
@@ -728,10 +712,10 @@
 				</dict>
 				<dict>
 					<key>begin</key>
-					<string>(\()</string>
+					<string>\(</string>
 					<key>beginCaptures</key>
 					<dict>
-						<key>1</key>
+						<key>0</key>
 						<dict>
 							<key>name</key>
 							<string>punctuation.definition.arguments.begin.python</string>
@@ -740,7 +724,15 @@
 					<key>contentName</key>
 					<string>meta.function.decorator.arguments.python</string>
 					<key>end</key>
-					<string>(?=\))</string>
+					<string>\)</string>
+					<key>endCaptures</key>
+					<dict>
+						<key>0</key>
+						<dict>
+							<key>name</key>
+							<string>punctuation.definition.arguments.end.python</string>
+						</dict>
+					</dict>
 					<key>patterns</key>
 					<array>
 						<dict>
@@ -757,28 +749,28 @@
 		</dict>
 		<dict>
 			<key>begin</key>
-			<string>^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*)</string>
+			<string>^\s*(?=@\s*[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[a-zA-Z_][a-zA-Z_0-9]*)*)</string>
 			<key>contentName</key>
 			<string>entity.name.function.decorator.python</string>
 			<key>end</key>
-			<string>(?=\s|$\n?|#)</string>
+			<string>(?=\s*(#|$))</string>
 			<key>name</key>
 			<string>meta.function.decorator.python</string>
 			<key>patterns</key>
 			<array>
 				<dict>
 					<key>begin</key>
-					<string>(?=(@)\s*[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*)</string>
+					<string>@</string>
 					<key>beginCaptures</key>
 					<dict>
-						<key>1</key>
+						<key>0</key>
 						<dict>
 							<key>name</key>
 							<string>punctuation.definition.decorator.python</string>
 						</dict>
 					</dict>
 					<key>end</key>
-					<string>(?=\s|$\n?|#)</string>
+					<string>(?=\s*(#|$))</string>
 					<key>patterns</key>
 					<array>
 						<dict>
@@ -826,49 +818,13 @@
 				</dict>
 			</array>
 		</dict>
-		<dict>
-			<key>include</key>
-			<string>#builtin_functions</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#builtin_types</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#builtin_exceptions</string>
-		</dict>
 		<dict>
 			<key>include</key>
 			<string>#docstrings</string>
 		</dict>
-		<dict>
-			<key>include</key>
-			<string>#magic_function_names</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#magic_variable_names</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#language_variables</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#generic_object_names</string>
-		</dict>
 		<dict>
 			<key>begin</key>
-			<string>(?:\.)?([a-zA-Z_][a-zA-Z_0-9]*)\s*(?=\()</string>
-			<key>beginCaptures</key>
-			<dict>
-				<key>1</key>
-				<dict>
-					<key>name</key>
-					<string>meta.function-call.generic.python</string>
-				</dict>
-			</dict>
+			<string>(?=\b[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[A-Za-z_][A-Za-z0-9_]*)*\s*\()</string>
 			<key>end</key>
 			<string>(\))</string>
 			<key>endCaptures</key>
@@ -883,19 +839,6 @@
 			<string>meta.function-call.python</string>
 			<key>patterns</key>
 			<array>
-				<dict>
-					<key>begin</key>
-					<string>(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\()</string>
-					<key>end</key>
-					<string>(?=\s*\()</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>include</key>
-							<string>#dotted_name</string>
-						</dict>
-					</array>
-				</dict>
 				<dict>
 					<key>begin</key>
 					<string>(\()</string>
@@ -923,11 +866,32 @@
 						</dict>
 					</array>
 				</dict>
+				<dict>
+					<key>begin</key>
+					<string>\G</string>
+					<key>end</key>
+					<string>(?=\()</string>
+					<key>patterns</key>
+					<array>
+						<dict>
+							<key>include</key>
+							<string>#dotted_name</string>
+						</dict>
+					</array>
+				</dict>
 			</array>
 		</dict>
+		<dict>
+			<key>comment</key>
+			<string>Py2 print statement that should only be matched after function calls</string>
+			<key>match</key>
+			<string>\b(print)(?=\s)(?!\s*[.,])</string>
+			<key>name</key>
+			<string>keyword.other.print.python</string>
+		</dict>
 		<dict>
 			<key>begin</key>
-			<string>(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\[)</string>
+			<string>(?=[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[a-zA-Z_][a-zA-Z_0-9]*)*\s*\[)</string>
 			<key>end</key>
 			<string>(\])</string>
 			<key>endCaptures</key>
@@ -942,19 +906,6 @@
 			<string>meta.item-access.python</string>
 			<key>patterns</key>
 			<array>
-				<dict>
-					<key>begin</key>
-					<string>(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\[)</string>
-					<key>end</key>
-					<string>(?=\s*\[)</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>include</key>
-							<string>#dotted_name</string>
-						</dict>
-					</array>
-				</dict>
 				<dict>
 					<key>begin</key>
 					<string>(\[)</string>
@@ -978,6 +929,19 @@
 						</dict>
 					</array>
 				</dict>
+				<dict>
+					<key>begin</key>
+					<string>\G</string>
+					<key>end</key>
+					<string>(?=\[)</string>
+					<key>patterns</key>
+					<array>
+						<dict>
+							<key>include</key>
+							<string>#dotted_name</string>
+						</dict>
+					</array>
+				</dict>
 			</array>
 		</dict>
 		<dict>
@@ -1041,10 +1005,6 @@
 			<key>include</key>
 			<string>#line_continuation</string>
 		</dict>
-		<dict>
-			<key>include</key>
-			<string>#language_variables</string>
-		</dict>
 		<dict>
 			<key>match</key>
 			<string>\b(None|True|False|Ellipsis|NotImplemented)\b</string>
@@ -1060,6 +1020,8 @@
 			<string>#string_quoted_double</string>
 		</dict>
 		<dict>
+			<key>comment</key>
+			<string>Covers every (remaining) identifier</string>
 			<key>include</key>
 			<string>#dotted_name</string>
 		</dict>
@@ -1272,6 +1234,15 @@
 	</array>
 	<key>repository</key>
 	<dict>
+		<key>allcaps_constant</key>
+		<dict>
+			<key>comment</key>
+			<string>Match identifiers in ALL_CAPS as constants.</string>
+			<key>match</key>
+			<string>\b([A-Z_][A-Z0-9_]*)\b(?![\.|\(])</string>
+			<key>name</key>
+			<string>constant.other.allcaps.python</string>
+		</dict>
 		<key>annotated_arguments</key>
 		<dict>
 			<key>begin</key>
@@ -1412,89 +1383,15 @@
 		</dict>
 		<key>builtin_functions</key>
 		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>begin</key>
-					<string>(?&lt;!\.)(__import__|ascii|abs|all|any|apply|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|copyright|credits|del|delattr|dict|dir|divmod|enumerate|eval|exec|execfile|exit|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|license|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|print|property|quit|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unicode|unichr|vars|xrange|zip)\s*(?=\()</string>
-					<key>beginCaptures</key>
-					<dict>
-						<key>1</key>
-						<dict>
-							<key>name</key>
-							<string>support.function.builtin.python</string>
-						</dict>
-					</dict>
-					<key>end</key>
-					<string>(\))</string>
-					<key>endCaptures</key>
-					<dict>
-						<key>1</key>
-						<dict>
-							<key>name</key>
-							<string>punctuation.definition.arguments.end.python</string>
-						</dict>
-					</dict>
-					<key>name</key>
-					<string>meta.function-call.python</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>begin</key>
-							<string>(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\()</string>
-							<key>end</key>
-							<string>(?=\s*\()</string>
-							<key>patterns</key>
-							<array>
-								<dict>
-									<key>include</key>
-									<string>#dotted_name</string>
-								</dict>
-							</array>
-						</dict>
-						<dict>
-							<key>begin</key>
-							<string>(\()</string>
-							<key>beginCaptures</key>
-							<dict>
-								<key>1</key>
-								<dict>
-									<key>name</key>
-									<string>punctuation.definition.arguments.begin.python</string>
-								</dict>
-							</dict>
-							<key>contentName</key>
-							<string>meta.function-call.arguments.python</string>
-							<key>end</key>
-							<string>(?=\))</string>
-							<key>patterns</key>
-							<array>
-								<dict>
-									<key>include</key>
-									<string>#keyword_arguments</string>
-								</dict>
-								<dict>
-									<key>include</key>
-									<string>$self</string>
-								</dict>
-							</array>
-						</dict>
-					</array>
-				</dict>
-				<dict>
-					<key>comment</key>
-					<string>These are statements in Py2, but don't really fit into keyword.control.flow with the rest</string>
-					<key>match</key>
-					<string>(?&lt;!\.)\b(print|del)\b</string>
-					<key>name</key>
-					<string>support.function.builtin.python</string>
-				</dict>
-			</array>
+			<key>match</key>
+			<string>(?&lt;!\.)\b(__import__|abs|all|any|apply|ascii|bin|buffer|callable|chr|cmp|coerce|compile|copyright|credits|delattr|dir|divmod|enumerate|eval|exec|execfile|exit|filter|format|getattr|globals|hasattr|hash|help|hex|id|input|intern|isinstance|issubclass|iter|len|license|locals|long|map|max|memoryview|min|next|oct|open|ord|pow|print|property|quit|range|raw_input|reduce|reload|repr|reversed|round|setattr|sorted|sum|unichr|vars|xrange|zip)\b</string>
+			<key>name</key>
+			<string>support.function.builtin.python</string>
 		</dict>
 		<key>builtin_types</key>
 		<dict>
 			<key>match</key>
-			<string>(?&lt;!\.)\b(ascii|basestring|bin|bool|buffer|bytearray|bytes|classmethod|complex|dict|file|float|frozenset|hex|int|list|long|object|oct|property|reversed|set|slice|staticmethod|str|super|tuple|type|unicode|xrange)\b</string>
+			<string>(?&lt;!\.)\b(basestring|bool|bytearray|bytes|classmethod|complex|dict|file|float|frozenset|int|list|object|property|set|slice|staticmethod|str|super|tuple|type|unicode)\b</string>
 			<key>name</key>
 			<string>support.type.python</string>
 		</dict>
@@ -1624,14 +1521,24 @@
 		<key>dotted_name</key>
 		<dict>
 			<key>begin</key>
-			<string>(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)</string>
+			<string>(?=(?:\.\s*)?[A-Za-z_][A-Za-z0-9_]*(?:\s*\.\s*[A-Za-z_][A-Za-z0-9_]*)*)</string>
+			<key>contentName</key>
+			<string>meta.dotted-name.python</string>
 			<key>end</key>
-			<string>(?![A-Za-z0-9_\.])</string>
+			<string>(?![A-Za-z0-9_\.\s])|(?=(?&lt;!\.)\s+[^.])|$</string>
 			<key>patterns</key>
 			<array>
 				<dict>
 					<key>begin</key>
-					<string>(\.)(?=[A-Za-z_][A-Za-z0-9_]*)</string>
+					<string>\.</string>
+					<key>beginCaptures</key>
+					<dict>
+						<key>0</key>
+						<dict>
+							<key>name</key>
+							<string>meta.dot.python</string>
+						</dict>
+					</dict>
 					<key>end</key>
 					<string>(?![A-Za-z0-9_])</string>
 					<key>patterns</key>
@@ -1648,6 +1555,10 @@
 							<key>include</key>
 							<string>#illegal_names</string>
 						</dict>
+						<dict>
+							<key>include</key>
+							<string>#allcaps_constant</string>
+						</dict>
 						<dict>
 							<key>include</key>
 							<string>#generic_names</string>
@@ -1656,7 +1567,7 @@
 				</dict>
 				<dict>
 					<key>begin</key>
-					<string>(?&lt;!\.)(?=[A-Za-z_][A-Za-z0-9_]*)</string>
+					<string>(?=[A-Za-z_])</string>
 					<key>end</key>
 					<string>(?![A-Za-z0-9_])</string>
 					<key>patterns</key>
@@ -1689,6 +1600,10 @@
 							<key>include</key>
 							<string>#language_variables</string>
 						</dict>
+						<dict>
+							<key>include</key>
+							<string>#allcaps_constant</string>
+						</dict>
 						<dict>
 							<key>include</key>
 							<string>#generic_names</string>
@@ -1825,40 +1740,12 @@
 			<key>match</key>
 			<string>(\\U[0-9A-Fa-f]{8})|(\\u[0-9A-Fa-f]{4})|(\\N\{[a-zA-Z0-9 ]+\})</string>
 		</dict>
-		<key>function_name</key>
-		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>include</key>
-					<string>#magic_function_names</string>
-				</dict>
-				<dict>
-					<key>include</key>
-					<string>#magic_variable_names</string>
-				</dict>
-				<dict>
-					<key>include</key>
-					<string>#builtin_exceptions</string>
-				</dict>
-				<dict>
-					<key>include</key>
-					<string>#builtin_functions</string>
-				</dict>
-				<dict>
-					<key>include</key>
-					<string>#builtin_types</string>
-				</dict>
-				<dict>
-					<key>include</key>
-					<string>#generic_names</string>
-				</dict>
-			</array>
-		</dict>
 		<key>generic_names</key>
 		<dict>
 			<key>match</key>
 			<string>[A-Za-z_][A-Za-z0-9_]*</string>
+			<key>name</key>
+			<string>meta.generic-name.python</string>
 		</dict>
 		<key>generic_object_names</key>
 		<dict>
diff --git a/highlight_test.pyw b/highlight_test.pyw
new file mode 100644
index 0000000..7de4e5d
--- /dev/null
+++ b/highlight_test.pyw
@@ -0,0 +1,47 @@
+list(map(str, range(100)))
+[str(i) for i in range(100)]
+
+super(arg1=1)(arg2=2)
+list abs, map
+some.Ellipsis NotImplemented
+
+print (file=None) print . __class__
+print keyword print __init__
+
+__init__ . something(arg=22)
+
+callback(print, print , print)
+
+.__init__
+__init__ [2]
+
+
+@ deco . __init__ (call=some)  # rator
+def function():
+    pass
+
+
+@dêco(func=call)
+def sômething():
+    pass
+
+
+@normal.decorator
+class Class():
+
+    @wraps(method)#comment
+    def wrapper(self):
+        pass
+
+ccesŝ[2]  # currently matched as "list"
+
+sômething(arg=22)
+
+CONSTANT
+dotted.CONSTANT
+constant.after().FUNCTION
+
+some.Error y.s.e.Exception
+
+ident = (value.dotted
+         .__init__)
