diff --git a/src/bcon.c b/src/bcon.c
index cbb70ff..34fea05 100644
--- a/src/bcon.c
+++ b/src/bcon.c
@@ -46,7 +46,7 @@ bcon_token_t bcon_token(char *s) {
     if (s == 0) return Token_EOD;
     switch (s[0]) {
     case ':': if (s[1] != '\0' && s[2] != '\0' && s[3] != '\0' && s[4] == '\0' &&
-                  s[3] == ':' && (s[1] == '_' || s[1] == 'P' || s[1] == 'R'))
+                  s[3] == ':' && (s[1] == '_' || s[1] == 'P' || s[1] == 'Q' || s[1] == 'R'))
                                 return Token_Typespec; break;
     case '{': if (s[1] == '\0') return Token_OpenBrace; break;
     case '}': if (s[1] == '\0') return Token_CloseBrace; break;
@@ -111,6 +111,13 @@ bcon_error_t bson_bcon_key_value(bson *b, const char *key, const char *typespec,
         default: printf("\nptype:'%c' utype:'%c'\n", ptype, utype); assert(NOT_REACHED); break;
         }
         break;
+    case 'Q': /* krv(b, key, utype, bci) */
+        switch (utype) {
+        case 'i': if (*bci.Ri != -1) bson_append_int( b, key, *bci.Ri ); break;
+        case 'l': if (*bci.Rl != -1) bson_append_long( b, key, *bci.Rl ); break;
+        default: printf("\nptype:'%c' utype:'%c'\n", ptype, utype); assert(NOT_REACHED); break;
+        }
+        break;
     case 'P': /* kpv(b, key, utype, bci) */
         if (*bci.Pv != 0) {
             switch (utype) {
@@ -335,6 +342,13 @@ void bcon_print(const bcon *bc) { /* prints internal representation, not JSON */
                 default: printf("\ntypespec:\"%s\"\n", typespec); assert(NOT_REACHED); break;
                 }
                 break;
+            case 'Q':
+                switch (typespec[2]) {
+                case 'i': printf("%sQi(0x%lx,%d)", delim, (unsigned long)bci.Ri, *bci.Ri); break;
+                case 'l': printf("%sQl(0x%lx,%ld)", delim, (unsigned long)bci.Rl, *bci.Rl); break;
+                default: printf("\ntypespec:\"%s\"\n", typespec); assert(NOT_REACHED); break;
+                }
+                break;
             case 'P':
                 switch (typespec[2]) {
                 case 'f': printf("%sPf(0x%lx,0x%lx,%f)", delim, (unsigned long)bci.Pf, (unsigned long)(bci.Pf ? *bci.Pf : 0), bci.Pf && *bci.Pf ? **bci.Pf : 0.0); break;
diff --git a/src/bcon.h b/src/bcon.h
index a8167eb..f2d505d 100644
--- a/src/bcon.h
+++ b/src/bcon.h
@@ -281,6 +281,11 @@ typedef union bcon {
 /** BCON internal 12 int64* 64-bit Integer reference interpolation type-specifier */
 #define BTRL ":Rl:"
 
+/** BCON internal 10 int32* 32-bit Integer special reference interpolation type-specifier - conditional != -1 */
+#define BTQI ":Qi:"
+/** BCON internal 12 int64* 64-bit Integer special reference interpolation type-specifier - conditional != -1 */
+#define BTQL ":Ql:"
+
 /** BCON internal 01 double** Floating point pointer interpolation type-specifier */
 #define BTPF ":Pf:"
 /** BCON internal 02 char** string pointer interpolation type-specifier */
@@ -346,6 +351,11 @@ typedef union bcon {
 /** BCON 12 int64* 64-bit Integer interpolation value */
 #define BRL(v) BTRL, { .Rl = (v) }
 
+/** BCON 10 int32* 32-bit Integer special interpolation value - conditional != -1 */
+#define BQI(v) BTQI, { .Ri = (v) }
+/** BCON 12 int64* 64-bit Integer special interpolation value - conditional != -1 */
+#define BQL(v) BTQL, { .Rl = (v) }
+
 /** BCON 01 double** Floating point interpolation value */
 #define BPF(v) BTPF, { .Pf = (v) }
 /** BCON 02 char** string interpolation value */
diff --git a/test/bcon_test.c b/test/bcon_test.c
index 9650b73..2e3ddb0 100644
--- a/test/bcon_test.c
+++ b/test/bcon_test.c
@@ -198,6 +198,15 @@ void test_pointer_interpolation( void ) {
     test_bson_from_bcon( pointer_interpolation, BCON_OK, BSON_VALID );
 }
 
+void test_special_interpolation() {
+    int i = 2;
+    long l = 3;
+    bcon special_interpolation[] = {"first", "0", "int", BQI(&i), "long", BQL(&l), "last", "1", BEND};
+    test_bson_from_bcon( special_interpolation, BCON_OK, BSON_VALID );
+    i = l = -1;
+    test_bson_from_bcon( special_interpolation, BCON_OK, BSON_VALID );
+}
+
 void test_oid_generation( void ) {
     char oid_s[] = "010203040506070809101112";
     char **poid_s = (char**)&oid_s;
@@ -405,6 +414,7 @@ struct test_suite {
     NAME_VALUE(test_basic_types),
     NAME_VALUE(test_reference_interpolation),
     NAME_VALUE(test_pointer_interpolation),
+    NAME_VALUE(test_special_interpolation),
     NAME_VALUE(test_oid_generation),
     NAME_VALUE(test_reference_interpolation_example),
     NAME_VALUE(test_pointer_interpolation_example),
