Index: src/SynTree/AddressExpr.cc
===================================================================
--- src/SynTree/AddressExpr.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/AddressExpr.cc	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -53,6 +53,4 @@
 			} // if
 		}
-		// result of & is never an lvalue
-		get_result()->set_lvalue( false );
 	}
 }
Index: src/SynTree/ArrayType.cc
===================================================================
--- src/SynTree/ArrayType.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/ArrayType.cc	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -26,5 +26,4 @@
 ArrayType::ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes )
 	: Type( tq, attributes ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
-	base->set_lvalue( false );
 }
 
Index: src/SynTree/CommaExpr.cc
===================================================================
--- src/SynTree/CommaExpr.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/CommaExpr.cc	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -23,9 +23,5 @@
 CommaExpr::CommaExpr( Expression *arg1, Expression *arg2 )
 		: Expression(), arg1( arg1 ), arg2( arg2 ) {
-	// xxx - result of a comma expression is never an lvalue, so should set lvalue
-	// to false on all result types. Actually doing this causes some strange things
-	// to happen in later passes (particularly, Specialize, Lvalue, and Box). This needs to be looked into.
 	set_result( maybeClone( arg2->get_result() ) );
-	// get_type->set_isLvalue( false );
 }
 
@@ -41,4 +37,5 @@
 bool CommaExpr::get_lvalue() const {
 	// This is wrong by C, but the current implementation uses it.
+	// (ex: Specialize, Lvalue and Box)
 	return arg2->get_lvalue();
 }
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/Expression.cc	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -115,5 +115,4 @@
 	assert( var->get_type() );
 	Type * type = var->get_type()->clone();
-	type->set_lvalue( true );
 
 	// xxx - doesn't quite work yet - get different alternatives with the same cost
@@ -125,5 +124,5 @@
 	// 	long long int value;
 	// 	if ( decl->valueOf( var, value ) ) {
-	// 		type->set_lvalue( false );
+	// 		type->set_lvalue( false ); // Would have to move to get_lvalue.
 	// 	}
 	// }
@@ -384,5 +383,4 @@
 	sub.apply( res );
 	result = res;
-	result->set_lvalue( true );
 	result->get_qualifiers() |= aggregate->result->get_qualifiers();
 }
@@ -433,7 +431,4 @@
 			// if references are still allowed in the AST, dereference returns a reference
 			ret->set_result( new ReferenceType( Type::Qualifiers(), ret->get_result() ) );
-		} else {
-			// references have been removed, in which case dereference returns an lvalue of the base type.
-			ret->result->set_lvalue( true );
 		}
 	}
@@ -591,5 +586,4 @@
 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : initializer( initializer ) {
 	assert( type && initializer );
-	type->set_lvalue( true );
 	set_result( type );
 }
Index: src/SynTree/TupleExpr.cc
===================================================================
--- src/SynTree/TupleExpr.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/TupleExpr.cc	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -71,6 +71,4 @@
 	assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d in expr %s", type->size(), index, toString( tuple ).c_str() );
 	set_result( (*std::next( type->get_types().begin(), index ))->clone() );
-	// like MemberExpr, TupleIndexExpr is always an lvalue
-	get_result()->set_lvalue( true );
 }
 
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/Type.cc	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -85,5 +85,5 @@
 const char * Type::FuncSpecifiersNames[] = { "inline", "_Noreturn", "fortran" };
 const char * Type::StorageClassesNames[] = { "extern", "static", "auto", "register", "_Thread_local" };
-const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
+const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "mutex", "_Atomic" };
 
 Type * Type::stripDeclarator() {
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/Type.h	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -102,8 +102,8 @@
 	}; // StorageClasses
 
-	enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Lvalue = 1 << 3, Mutex = 1 << 4, Atomic = 1 << 5, NumTypeQualifier = 6 };
+	enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Mutex = 1 << 3, Atomic = 1 << 4, NumTypeQualifier = 5 };
 	static const char * QualifiersNames[];
 	union Qualifiers {
-		enum { Mask = ~(Restrict | Lvalue) };
+		enum { Mask = ~Restrict };
 		unsigned int val;
 		struct {
@@ -111,5 +111,4 @@
 			bool is_restrict : 1;
 			bool is_volatile : 1;
-			bool is_lvalue : 1;
 			bool is_mutex : 1;
 			bool is_atomic : 1;
@@ -153,5 +152,4 @@
 	bool get_volatile() const { return tq.is_volatile; }
 	bool get_restrict() const { return tq.is_restrict; }
-	bool get_lvalue() const { return tq.is_lvalue; }
 	bool get_mutex() const { return tq.is_mutex; }
 	bool get_atomic() const { return tq.is_atomic; }
@@ -159,5 +157,4 @@
 	void set_volatile( bool newValue ) { tq.is_volatile = newValue; }
 	void set_restrict( bool newValue ) { tq.is_restrict = newValue; }
-	void set_lvalue( bool newValue ) { tq.is_lvalue = newValue; }
 	void set_mutex( bool newValue ) { tq.is_mutex = newValue; }
 	void set_atomic( bool newValue ) { tq.is_atomic = newValue; }
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision 849720f09e161bb0a6d5dba500bf709d48c37197)
+++ src/SynTree/module.mk	(revision b4f8808d54aaa8b4ea7ffa142e012fe33696f7b0)
@@ -49,6 +49,5 @@
       SynTree/TypeSubstitution.cc \
       SynTree/Attribute.cc \
-      SynTree/DeclReplacer.cc \
-      SynTree/TopLvalue.cc
+      SynTree/DeclReplacer.cc
 
 SRC += $(SRC_SYNTREE)
