added support for structures in q syntax.
diff --git a/aos/build/queues/objects/namespaces.rb b/aos/build/queues/objects/namespaces.rb
index b799d36..74f7197 100644
--- a/aos/build/queues/objects/namespaces.rb
+++ b/aos/build/queues/objects/namespaces.rb
@@ -43,7 +43,7 @@
 end
 class BoundSituation < LocalSituation
 	def initialize(locals,bind_to)
-		@globals = globals
+		@globals = locals.globals
 		@local = bind_to
 	end
 end
diff --git a/aos/build/queues/objects/q_file.rb b/aos/build/queues/objects/q_file.rb
index f683dda..beaf8f0 100644
--- a/aos/build/queues/objects/q_file.rb
+++ b/aos/build/queues/objects/q_file.rb
@@ -134,6 +134,8 @@
 				suite << QueueStmt.parse(tokens)
 			when "interface"
 				suite << InterfaceStmt.parse(tokens)
+			when "struct"
+				suite << StructStmt.parse(tokens)
 			else
 				tokens.qError(<<ERROR_MSG)
 expected a "package","import","queue","queue_group", or "message" statement rather
diff --git a/aos/build/queues/objects/q_struct.rb b/aos/build/queues/objects/q_struct.rb
new file mode 100644
index 0000000..cd47fe6
--- /dev/null
+++ b/aos/build/queues/objects/q_struct.rb
@@ -0,0 +1,37 @@
+
+class StructStmt 
+	def initialize(name,suite)
+		@name = name
+		@suite = suite
+	end
+	def q_eval(locals)
+		group = Target::StructDec.new(@name)
+		locals.register(group)
+		@suite.each do |stmt|
+			stmt.q_eval(locals.bind(group))
+		end 
+		return group
+	end
+	def self.parse(tokens)
+		name = tokens.expect(:tWord).data
+		values = []
+		tokens.expect(:tOpenB)
+		while(tokens.peak != :tCloseB)
+			values << MessageElementStmt.parse(tokens)
+		end
+		names = {}
+		values.each do |val|
+			if(names[val.name])
+				raise QSyntaxError.new(<<ERROR_MSG)
+Hey! duplicate name #{val.name.inspect} in your message declaration statement (message #{name}).
+\tI found them at: #{names[val.name].q_stack_name()} and #{val.q_stack_name()}.
+\tWot. Wot.
+ERROR_MSG
+			end
+			names[val.name] = val
+		end
+		tokens.expect(:tCloseB)
+		tokens.expect(:tSemi)
+		self.new(name,values)
+	end
+end
diff --git a/aos/build/queues/objects/queue.rb b/aos/build/queues/objects/queue.rb
index e993eb9..1199cc2 100644
--- a/aos/build/queues/objects/queue.rb
+++ b/aos/build/queues/objects/queue.rb
@@ -1,12 +1,13 @@
 class MessageElementStmt < QStmt
 	attr_accessor :name
-	def initialize(type,name,length = nil) #lengths are for arrays
-		@type = type
+	def initialize(type_name,name,length = nil) #lengths are for arrays
+		@type_name = type_name
+		@type = type_name.to_s
 		@name = name
 		@length = length
 	end
 	CommonMistakes = {"short" => "int16_t","int" => "int32_t","long" => "int64_t"}
-	def check_type_error()
+	def check_type_error(locals)
 		if(!(Sizes[@type] || (@length != nil && @type == "char")) )
 			if(correction = CommonMistakes[@type])
 				raise QError.new(<<ERROR_MSG)
@@ -23,11 +24,13 @@
 \tWot. Wot.
 ERROR_MSG
 			else
+				@is_struct_type = true
+				return if(lookup_type(locals))
 				raise QError.new(<<ERROR_MSG)
 Hey! you have a \"#{@type}\" in your message statement.
 \tThat is not in the list of supported types.
 \there is the list of supported types:
-\tint{8,16,32,64}_t,uint{8,16,32,64}_t,bool,float,double#{len_comment}
+\tint{8,16,32,64}_t,uint{8,16,32,64}_t,bool,float,double
 \tWot. Wot.
 ERROR_MSG
 			end
@@ -72,21 +75,30 @@
 \tWot. Wot.
 ERROR_MSG
 	end
+	def lookup_type(locals)
+		return @type_name.lookup(locals)
+	end
 	def q_eval(locals)
-		check_type_error()
-		if(@length == nil)
-			member = Target::MessageElement.new(@type,@name)
+		check_type_error(locals)
+		if(@is_struct_type)
+			tval = lookup_type(locals)
+			member = Target::MessageStructElement.new(tval, name)
 		else
-			member = Target::MessageArrayElement.new(@type,@name,@length)
+			if(@length == nil)
+				member = Target::MessageElement.new(@type,@name)
+			else
+				member = Target::MessageArrayElement.new(@type,@name,@length)
+			end
+			member.size = size()
+			member.zero = Zero[@type] || "0";
+			member.printformat = toPrintFormat()
 		end
-		member.size = size()
-		member.zero = Zero[@type] || "0";
-		member.printformat = toPrintFormat()
 		locals.local.add_member(member)
 	end
 	def self.parse(tokens)
 		line = tokens.pos
-		type = tokens.expect(:tWord).data
+		#type = tokens.expect(:tWord).data
+		type_name = QualifiedName.parse(tokens)
 		len = nil
 		if(tokens.peak == :tOpenB)
 			tokens.expect(:tOpenB)
@@ -95,7 +107,7 @@
 		end
 		name = tokens.expect(:tWord).data
 		tokens.expect(:tSemi)
-		return self.new(type,name,len).set_line(line)
+		return self.new(type_name,name,len).set_line(line)
 	end
 end
 class MessageStmt < QStmt