diff --git a/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java b/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
index a7f1b5c..508738a 100644
--- a/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
+++ b/engine/src/main/java/org/teiid/query/optimizer/relational/RelationalPlanner.java
@@ -33,6 +33,7 @@
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.core.id.IDGenerator;
 import org.teiid.core.util.HashCodeUtil;
+import org.teiid.core.util.StringUtil;
 import org.teiid.dqp.internal.process.Request;
 import org.teiid.language.SQLConstants;
 import org.teiid.metadata.Procedure;
@@ -163,7 +164,7 @@
         	planToProcessConverter = context.getPlanToProcessConverter();
         }
         if (planToProcessConverter == null) {
-        	planToProcessConverter = new PlanToProcessConverter(metadata, idGenerator, analysisRecord, capFinder);
+        	planToProcessConverter = new PlanToProcessConverter(metadata, idGenerator, analysisRecord, capFinder, context);
         }
 		
 		//plan with
@@ -224,7 +225,7 @@
 
         // Build rule set based on hints
         RuleStack rules = buildRules();
-
+        context.setSourceHint(sourceHint);
         // Run rule-based optimizer
         plan = executeRules(rules, plan);
 
@@ -360,26 +361,58 @@
         // Walk through each dependent group hint and
         // attach to the correct source node
         for (String groupName : groups) {
-            // Walk through nodes and apply hint to all that match group name
-            boolean appliedHint = applyHint(nodes, groupName, hintProperty);
+        	boolean appliedHint = false;
+        	if (groupName.startsWith(".")) { //$NON-NLS-1$
+	        	appliedHint = applyGlobalTableHint(plan, hintProperty, groupName.substring(1));
+        	} else {
+        		appliedHint = applyHint(nodes, groupName, hintProperty);
 
-            if(! appliedHint) {
-                //check if it is partial group name
-                Collection groupNames = metadata.getGroupsForPartialName(groupName);
-                if(groupNames.size() == 1) {
-                    groupName = (String)groupNames.iterator().next();
-                    appliedHint = applyHint(nodes, groupName, hintProperty);
-                }
-                
                 if(! appliedHint) {
-                	String msg = QueryPlugin.Util.getString("ERR.015.004.0010", groupName); //$NON-NLS-1$
-                	if (this.analysisRecord.recordAnnotations()) {
-                		this.analysisRecord.addAnnotation(new Annotation(Annotation.HINTS, msg, "ignoring hint", Priority.MEDIUM)); //$NON-NLS-1$
-                	}
-                }
+                    //check if it is partial group name
+                    Collection groupNames = metadata.getGroupsForPartialName(groupName);
+                    if(groupNames.size() == 1) {
+                        groupName = (String)groupNames.iterator().next();
+                        appliedHint = applyHint(nodes, groupName, hintProperty);
+                    }
+                }        		
+        	}
+        	
+            if(! appliedHint) {
+            	String msg = QueryPlugin.Util.getString("ERR.015.004.0010", groupName); //$NON-NLS-1$
+            	if (this.analysisRecord.recordAnnotations()) {
+            		this.analysisRecord.addAnnotation(new Annotation(Annotation.HINTS, msg, "ignoring hint", Priority.MEDIUM)); //$NON-NLS-1$
+            	}
             }
         }
     }
+
+	private boolean applyGlobalTableHint(PlanNode plan,
+			NodeConstants.Info hintProperty, String groupName) {
+		GroupSymbol gs = new GroupSymbol(groupName);
+		List<String> nameParts = StringUtil.split(gs.getName(), "."); //$NON-NLS-1$
+		PlanNode root = plan;
+		boolean found = true;
+		for (int i = 0; i < nameParts.size() && found; i++) {
+			String part = nameParts.get(i);
+			List<PlanNode> targets = NodeEditor.findAllNodes(root.getFirstChild(), NodeConstants.Types.SOURCE, NodeConstants.Types.SOURCE);
+			boolean leaf = i == nameParts.size() - 1;
+			found = false;
+			for (PlanNode planNode : targets) {
+				if (part.equalsIgnoreCase(planNode.getGroups().iterator().next().getShortName())) {
+					if (leaf) {
+						planNode.setProperty(hintProperty, Boolean.TRUE);
+		                return true;
+					} else if (planNode.getChildren().isEmpty()) {
+						return false;
+					}
+					root = planNode;
+					found = true;
+					break;
+				}
+			}
+		}
+		return false;
+	}
     
     private static boolean applyHint(List<PlanNode> nodes, String groupName, NodeConstants.Info hintProperty) {
         boolean appliedHint = false;