Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/CodeGen/CodeGenerator.cc	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -289,5 +289,5 @@
 					if ( obj->get_init() ) {
 						obj->get_init()->accept( *visitor );
-						last_val = ((ConstantExpr *)(((SingleInit *)(obj->init))->value))->constant.get_ival();
+						// last_val = ((ConstantExpr *)(((SingleInit *)(obj->init))->value))->constant.get_ival();
 					} else {
 						output << ++last_val;
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/Parser/ExpressionNode.cc	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -509,4 +509,10 @@
 } // build_varref
 
+QualifiedNameExpr * build_qualified_expr( const DeclarationNode * decl_node, const NameExpr * name ) {
+	Type * targetType = maybeMoveBuildType( decl_node );
+	return new QualifiedNameExpr( targetType, name->name );
+	return nullptr;
+}
+
 DimensionExpr * build_dimensionref( const string * name ) {
 	DimensionExpr * expr = new DimensionExpr( *name );
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/Parser/ParseNode.h	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -183,4 +183,5 @@
 
 NameExpr * build_varref( const std::string * name );
+QualifiedNameExpr * build_qualified_expr( const DeclarationNode * decl_node, const NameExpr * name );
 DimensionExpr * build_dimensionref( const std::string * name );
 
Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -897,15 +897,15 @@
 						}
 
-						if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);
-						else if (const ast::EnumInstType * enumInst = argType.as<ast::EnumInstType>()) {
-							const ast::EnumDecl * enumDecl = enumInst->base;
-							if ( const ast::Type* enumType = enumDecl->base ) {
-								// instance of enum (T) is a instance of type (T) 
-								funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type));
-							} else {
-								// instance of an untyped enum is techically int
-								funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type));
-							}
-						} 
+						if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);						
+						// else if (const ast::EnumInstType * enumInst = argType.as<ast::EnumInstType>()) {
+						// 	const ast::EnumDecl * enumDecl = enumInst->base; // Here
+						// 	if ( const ast::Type* enumType = enumDecl->base ) {
+						// 		// instance of enum (T) is a instance of type (T) 
+						// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type));
+						// 	} else {
+						// 		// instance of an untyped enum is techically int
+						// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type));
+						// 	}
+						// }
 						else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type));
 					}
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/ResolvExpr/ConversionCost.cc	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -695,4 +695,5 @@
 	if ( const ast::Type * baseType = baseEnum->base ) {
 		cost = costCalc( baseType, dst, srcIsLvalue, symtab, env );
+		// cost = Cost::safe;
 	} else {
 		(void)enumInstType;
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/ResolvExpr/Unify.cc	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -165,4 +165,18 @@
 		ast::Type * newFirst  = shallowCopy( first  );
 		ast::Type * newSecond = shallowCopy( second );
+		if ( auto temp = dynamic_cast<const ast::EnumInstType *>(first) ) {
+			if ( !dynamic_cast< const ast::EnumInstType * >( second ) ) {
+				const ast::EnumDecl * baseEnum = dynamic_cast<const ast::EnumDecl *>(temp->base.get());
+				if ( auto t = baseEnum->base.get() ) {
+					newFirst = ast::shallowCopy( t );
+				}
+			}
+		} else if ( auto temp = dynamic_cast<const ast::EnumInstType *>(second) ) {
+			const ast::EnumDecl * baseEnum = dynamic_cast<const ast::EnumDecl *>(temp->base.get());
+			if ( auto t = baseEnum->base.get() ) {
+				newSecond = ast::shallowCopy( t );
+			}
+		}
+
 		newFirst ->qualifiers = {};
 		newSecond->qualifiers = {};
@@ -988,5 +1002,5 @@
 				if ( isTuple && isTuple2 ) {
 					++it; ++jt;  // skip ttype parameters before break
-				} else if ( isTuple ) {
+				} else if ( isTuple ) { 
 					// bundle remaining params into tuple
 					pty2 = tupleFromExprs( param2, jt, params2.end(), pty->qualifiers );
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/SynTree/Expression.h	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -163,4 +163,34 @@
 };
 
+// [Qualifier].name; Qualifier is the type_name from the parser
+class QualifiedNameExpr : public Expression {
+  public:
+	Type * type; // Convert to [parent] QualifiedNameExpr
+	std::string name; // Convert from NameExpr
+
+	QualifiedNameExpr( Type * type, std::string name): 
+		Expression(), type(type), name(name) {
+		std::cout << "Making QualifiedNameExpr" << std::endl;
+		print( std::cout );
+	}
+	QualifiedNameExpr( const QualifiedNameExpr & other): Expression(other), type(other.type), name(other.name) {
+
+	}
+	virtual ~QualifiedNameExpr() {
+		delete type;
+	}
+
+	virtual QualifiedNameExpr * clone() const override {
+		return new QualifiedNameExpr( * this );
+	}
+	virtual void accept( Visitor & v ) override { (void)v; }
+	virtual void accept( Visitor & v ) const override { (void)v; }
+	virtual Expression * acceptMutator( Mutator & m ) override { (void) m;return nullptr; }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override {
+		type->print( os, indent );
+		std::cout << name << std::endl;
+	}
+};
+
 /// VariableExpr represents an expression that simply refers to the value of a named variable.
 /// Does not take ownership of var.
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/SynTree/SynTree.h	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -103,4 +103,5 @@
 class DefaultArgExpr;
 class GenericExpr;
+class QualifiedNameExpr;
 
 class Type;
Index: src/Validate/Autogen.cpp
===================================================================
--- src/Validate/Autogen.cpp	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/Validate/Autogen.cpp	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -235,4 +235,11 @@
 	// Must visit children (enum constants) to add them to the symbol table.
 	if ( !enumDecl->body ) return;
+
+	// if ( auto enumBaseType = enumDecl->base ) {
+	// 	if ( auto enumBaseTypeAsStructInst = dynamic_cast<const ast::StructInstType *>(enumBaseType.get()) ) {
+	// 		const ast::StructDecl * structDecl = enumBaseTypeAsStructInst->base.get();
+	// 		this->previsit( structDecl );
+	// 	}
+	// }
 
 	ast::EnumInstType enumInst( enumDecl->name );
Index: tests/enum_tests/structEnum.cfa
===================================================================
--- tests/enum_tests/structEnum.cfa	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ tests/enum_tests/structEnum.cfa	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -2,29 +2,38 @@
 
 struct Point {
-    int x;
-    char y;
+     int x;
+     char y;
 };
 
 enum(Point) PointEnum {
-    first={
-        100,
-        'c'
-    },
-    second={
-        200,
-        'a'
-    }
+     first={
+         100,
+         'c'
+     },
+     second={
+         200,
+         'a'
+     }
 };
+
+PointEnum foo(PointEnum in) {
+     return in;
+}
 
 // The only valid usage
 struct Point apple = first;
 // Failed due to Qualified name is currently unimplemented.
-// struct Point banana = PointEnum.first;
+struct Point banana = PointEnum.first;
 
 int main() {
-    printf("%d %c\n", apple.x, apple.y);
-    // Failed; enumInstType is now not a real type and not instantiated.
-    // Not sure if we want that
-    // printf("%d %c\n", second.x, second.y);
-    return 0;
+     PointEnum vals = second;
+     PointEnum val2;
+     // P1
+     val2 = vals;
+
+     printf("%d %c\n", apple.x, apple.y);
+     // Failed; enumInstType is now not a real type and not instantiated.
+     // Not sure if we want that
+     // printf("%d %c\n", second.x, second.y);
+     return 0;
 }
