diff --git a/ExprPrimaryNodes.py b/ExprPrimaryNodes.py
index 527c93e9a07cae62f8b51a9463f831cbeae84de5..033c66c78601bc7138e1c08736afe9deb9ff9768 100644
--- a/ExprPrimaryNodes.py
+++ b/ExprPrimaryNodes.py
@@ -595,28 +595,40 @@ class ExprNode(ASTNode):
             self.myType = TypeStruct('java.lang.String', self.env.getNode('java.lang.String', 'type'))
             self.myType.link(self.env)
 
+            # if left/right is a string, we don't need value of
+            concatLeft = self.left
+            concatRight = self.right
+
             # var1 + var2 === String.valueOf(var1).concat( String.valueOf(var2) )
 
-            # methodInvoc name LPAREN args RPAREN (because it's static)
-            # MethodInvNode
-            # ID = NameNode
-            #       - name = "String.valueOf"
-            # args = ArgsNode
-            #       - exprs = [self.left]
-
-            # create MethodInvNode to call String.valueOf(left) and String.valueOf(right)
-            # 1. Make NameNode for String.valueOf
-            valueOfNameNode = NameNode(self.parseTree, True, self.typeName, "String.valueOf")
-            valueOfNameNode.env = self.env
-            # 2. Make ArgsNode for left and right
-            leftArg = ArgsNode(self.parseTree, self.typeName, [self.left])
-            rightArg = ArgsNode(self.parseTree, self.typeName, [self.right])
-            # 3. Put it all together
-            valueOfMethodInvLeft = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, leftArg)
-            valueOfMethodInvRight = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, rightArg)
-            # 4. Check type to be safe
-            # valueOfMethodInvLeft.checkType()
-            # valueOfMethodInvRight.checkType()
+            if self.left.myType.name != 'java.lang.String' or self.right.myType.name != 'java.lang.String':
+                # methodInvoc name LPAREN args RPAREN (because it's static)
+                # MethodInvNode
+                # ID = NameNode
+                #       - name = "String.valueOf"
+                # args = ArgsNode
+                #       - exprs = [self.left]
+
+                # create MethodInvNode to call String.valueOf(left) and String.valueOf(right)
+                # 1. Make NameNode for String.valueOf
+                valueOfNameNode = NameNode(self.parseTree, True, self.typeName, "String.valueOf")
+                valueOfNameNode.env = self.env
+
+                if self.left.myType.name != 'java.lang.String':
+                    # 2. Make ArgsNode
+                    leftArg = ArgsNode(self.parseTree, self.typeName, [self.left])
+                    # 3. Put it all together
+                    concatLeft = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, leftArg)
+                
+                if self.right.myType.name != 'java.lang.String':
+                    # 2. Make ArgsNode
+                    rightArg = ArgsNode(self.parseTree, self.typeName, [self.right])
+                    # 3. Put it all together
+                    concatRight = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, rightArg)
+
+                # 4. Check type to be safe
+                # concatLeft.checkType()
+                # concatRight.checkType()
 
 
             # methodInvoc primary PERIOD ID LPAREN args RPAREN
@@ -631,9 +643,9 @@ class ExprNode(ASTNode):
             # 1. Make NameNode for String.concat (name = "concat")
             concatNameNode = NameNode(self.parseTree, True, self.typeName, "concat")
             # 2. Make ArgsNode for right
-            rightArgMethodInv = ArgsNode(self.parseTree, self.typeName, [valueOfMethodInvRight])
+            rightArg = ArgsNode(self.parseTree, self.typeName, [concatRight])
             # 3. Put it all together
-            self.concatMethodInv = MethodInvNode(self.parseTree, self.typeName, concatNameNode, rightArgMethodInv, valueOfMethodInvLeft)
+            self.concatMethodInv = MethodInvNode(self.parseTree, self.typeName, concatNameNode, rightArg, concatLeft)
             # 4. Check type to be safe
             self.concatMethodInv.checkType()
 
@@ -727,6 +739,14 @@ class ExprNode(ASTNode):
             self.code += p(endLabel + ":", "")
             return
 
+        # String Add TODO
+        if (self.left.myType.name =='java.lang.String' or self.right.myType.name =='java.lang.String') and self.op == '+':
+            # ( String.valueOf(right) ).concat( left )
+            if not hasattr(self.concatMethodInv, "code"):
+                self.concatMethodInv.codeGen()
+            self.code += self.concatMethodInv.code
+            return
+
         # is binary and rest can use helper function:
         self.code += self.codeGenLeftRight()
 
@@ -753,24 +773,7 @@ class ExprNode(ASTNode):
             return
 
         # Binary operations:
-        # String Add TODO
-        if (self.left.myType.name =='java.lang.String' or self.right.myType.name =='java.lang.String') \
-        and self.op == '+':
-            # String.valueOf(left)
-            # if not hasattr(self.valueOfMethodInvLeft, "code"):
-            #     self.valueOfMethodInvLeft.codeGen()
-            # self.code += self.valueOfMethodInvLeft.code
-
-            # String.valueOf(right)
-            # if not hasattr(self.valueOfMethodInvLeft, "code"):
-            #     self.valueOfMethodInvLeft.codeGen()
-            # self.code += self.valueOfMethodInvLeft.code
-
-            # ( String.valueOf(right) ).concat( left )
-            if not hasattr(self.concatMethodInv, "code"):
-                self.concatMethodInv.codeGen()
-            self.code += self.concatMethodInv.code
-            return
+        
         # Number Add, Subtract, Multiply
         if self.op in ['+', '-', '*']:
             # operation -> generated code
diff --git a/NameNode.py b/NameNode.py
index 70ce82cf4de5bb8c57ac120ea9f530274ac48b5b..fcfe485d0e8568c40ef9a6d08855ffa01f550e6d 100644
--- a/NameNode.py
+++ b/NameNode.py
@@ -242,6 +242,11 @@ class NameNode(ASTNode):
                             self.methodClass = meth.env.getNode(meth.typeName, 'type')
 
                         self.methodName = self.IDs[0]
+
+                        if self.name == 'length':
+                            cNameNode = genNameNode(self.typeName)
+                            cNameNode.isThis = True
+                            self.prefixNodes.append(cNameNode)
                     else:
                         if curType.myType and curType.myType.isArray and self.IDs[0] == 'length':
                             self.myType = TypeStruct("int", None)