unsigned char Nd;               /* max # of Domains - 1 */
        unsigned char _reserved3[10];
        unsigned int apm[8];            /* AP ID mask */
-       unsigned int aqm[8];            /* AP queue mask */
-       unsigned int adm[8];            /* AP domain mask */
+       unsigned int aqm[8];            /* AP (usage) queue mask */
+       unsigned int adm[8];            /* AP (control) domain mask */
        unsigned char _reserved4[16];
 } __aligned(8);
 
 
 }
 
 /*
- * ap_test_config_domain(): Test, whether an AP usage domain is configured.
+ * ap_test_config_usage_domain(): Test, whether an AP usage domain
+ * is configured.
  * @domain AP usage domain ID
  *
  * Returns 0 if the usage domain is not configured
  *        1 if the usage domain is configured or
  *          if the configuration information is not available
  */
-static inline int ap_test_config_domain(unsigned int domain)
+int ap_test_config_usage_domain(unsigned int domain)
 {
        if (!ap_configuration)  /* QCI not supported */
                return domain < 16;
        return ap_test_config(ap_configuration->aqm, domain);
 }
+EXPORT_SYMBOL(ap_test_config_usage_domain);
+
+/*
+ * ap_test_config_ctrl_domain(): Test, whether an AP control domain
+ * is configured.
+ * @domain AP control domain ID
+ *
+ * Returns 1 if the control domain is configured
+ *        0 in all other cases
+ */
+int ap_test_config_ctrl_domain(unsigned int domain)
+{
+       if (!ap_configuration)  /* QCI not supported */
+               return 0;
+       return ap_test_config(ap_configuration->adm, domain);
+}
+EXPORT_SYMBOL(ap_test_config_ctrl_domain);
 
 /**
  * ap_query_queue(): Check if an AP queue is available.
        best_domain = -1;
        max_count = 0;
        for (i = 0; i < AP_DOMAINS; i++) {
-               if (!ap_test_config_domain(i) ||
+               if (!ap_test_config_usage_domain(i) ||
                    !test_bit_inv(i, ap_perms.aqm))
                        continue;
                count = 0;
                                      (void *)(long) qid,
                                      __match_queue_device_with_qid);
                aq = dev ? to_ap_queue(dev) : NULL;
-               if (!ap_test_config_domain(dom)) {
+               if (!ap_test_config_usage_domain(dom)) {
                        if (dev) {
                                /* Queue device exists but has been
                                 * removed from configuration.
 
 void ap_request_timeout(struct timer_list *t);
 void ap_bus_force_rescan(void);
 
+int ap_test_config_usage_domain(unsigned int domain);
+int ap_test_config_ctrl_domain(unsigned int domain);
+
 void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *ap_msg);
 struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type);
 void ap_queue_prepare_remove(struct ap_queue *aq);
 
        struct ap_message ap_msg;
        unsigned int weight, pref_weight;
        unsigned int func_code;
-       unsigned short *domain;
+       unsigned short *domain, tdom;
        int qid = 0, rc = -ENODEV;
        struct module *mod;
 
        if (rc)
                goto out;
 
+       /*
+        * If a valid target domain is set and this domain is NOT a usage
+        * domain but a control only domain, use the default domain as target.
+        */
+       tdom = *domain;
+       if (tdom >= 0 && tdom < AP_DOMAINS &&
+           !ap_test_config_usage_domain(tdom) &&
+           ap_test_config_ctrl_domain(tdom) &&
+           ap_domain_index >= 0)
+               tdom = ap_domain_index;
+
        pref_zc = NULL;
        pref_zq = NULL;
        spin_lock(&zcrypt_list_lock);
                        /* check if device is online and eligible */
                        if (!zq->online ||
                            !zq->ops->send_cprb ||
-                           ((*domain != (unsigned short) AUTOSELECT) &&
-                            (*domain != AP_QID_QUEUE(zq->queue->qid))))
+                           (tdom != (unsigned short) AUTOSELECT &&
+                            tdom != AP_QID_QUEUE(zq->queue->qid)))
                                continue;
                        /* check if device node has admission for this queue */
                        if (!zcrypt_check_queue(perms,