 								return tableData;
 							})
 							.then(function(tableData:TableData):WeavePromise {
+								if (debug)
+									weaveTrace('promising QKeys', debugId(tableData), hash);
 								return (WeaveAPI.QKeyManager as QKeyManager).getQKeysPromise(
 									getTablePromise,
 									keyType,
 									keyStrings
 								).then(function(qkeys:Vector.<IQualifiedKey>):TableData {
+									if (debug)
+										weaveTrace('got QKeys', debugId(tableData), hash);
 									tableData.derived_qkeys = qkeys;
 									return tableData;
 								});

		WeaveAPI.ClassRegistry.registerImplementation(IDataSource, WeaveDataSource, "Weave server");

		private static const SQLPARAMS:String = 'sqlParams';
		
		public function WeaveDataSource()
		{

					{
						var getTablePromise:WeavePromise = new WeavePromise(_service)
							.then(function(..._):AsyncToken {
								if (debug)
									weaveTrace('invoking getTable()', hash);
								return _service.getTable(result.tableId, sqlParams);
							});
						
						var keyStrings:Array;
						promise = getTablePromise
							.then(function(tableData:TableData):TableData {
								if (debug)
									weaveTrace('received', debugId(tableData), hash);
								
								if (!tableData.keyColumns)
									tableData.keyColumns = [];
								if (!tableData.columns)
									tableData.columns = {};
								
								var name:String;
								for each (name in tableData.keyColumns)
									if (!tableData.columns.hasOwnProperty(name))
