diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c5decad3d8be81a49dccdd4a748dc667994c587..00d2d7309442f1d3e9be2959c1f493d56e893461 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Removed ###
 
 ### Fixed ###
+- [#203](https://gitlab.com/caosdb/caosdb-server/-/issues/203)
 
 * Denying a role permission has no effect
   [#196](https://gitlab.com/caosdb/caosdb-server/-/issues/196). See security
diff --git a/src/main/java/org/caosdb/server/query/CQLParser.g4 b/src/main/java/org/caosdb/server/query/CQLParser.g4
index bcb4645ad7019d61f933793989e5d0afa5521f09..d5e375102d79d395b1f06c62c5aef9537092b0fc 100644
--- a/src/main/java/org/caosdb/server/query/CQLParser.g4
+++ b/src/main/java/org/caosdb/server/query/CQLParser.g4
@@ -133,6 +133,7 @@ entity_filter returns [EntityFilterInterface filter]
     (
         (
             LPAREN WHITE_SPACE?
+            (HAS_A (PROPERTY)?)?
             (
                 filter_expression {$filter = $filter_expression.efi;}
                 | conjunction {$filter = $conjunction.c;}
@@ -433,6 +434,7 @@ conjunction returns [Conjunction c]
         f1 = filter_expression {$c.add($f1.efi);}
         |
         LPAREN WHITE_SPACE?
+        (HAS_A (PROPERTY)?)?
         (
             f4 = filter_expression {$c.add($f4.efi);}
             | disjunction {$c.add($disjunction.d);}
@@ -473,6 +475,7 @@ disjunction returns [Disjunction d]
         f1 = filter_expression {$d.add($f1.efi);}
         |
         LPAREN WHITE_SPACE?
+        (HAS_A (PROPERTY)?)?
         (
             f4 = filter_expression {$d.add($f4.efi);}
             | conjunction {$d.add($conjunction.c);}
diff --git a/src/test/java/org/caosdb/server/query/TestCQL.java b/src/test/java/org/caosdb/server/query/TestCQL.java
index fe73e2b2c33749fac6d72a4c5b478eca5d154465..6d8f015d158aafe86baa087d6b56d38c0283ec62 100644
--- a/src/test/java/org/caosdb/server/query/TestCQL.java
+++ b/src/test/java/org/caosdb/server/query/TestCQL.java
@@ -281,6 +281,8 @@ public class TestCQL {
   // quotation marks gone rogue
   String quotation1 =
       "FIND ENTITY WHICH HAS A PROPERTY LIKE '*with double*' AND A PROPERTY LIKE '*and single*' AND A PROPERTY LIKE '*what\\'s wrong?*' AND A PROPERTY LIKE '*\\'*' AND A PROPERTY LIKE '*nothin\\'*' AND A PROPERTY LIKE '*\"\\'bla*'";
+  String issue203a = "FIND WHICH ( HAS pname )";
+  String issue203b = "FIND WHICH ( HAS pname1 AND REFERENCES pname2 )";
 
   @Test
   public void testQuery1()
@@ -7013,4 +7015,37 @@ public class TestCQL {
     assertEquals("POV(null,LIKE ,%nothin'%)", conj.getFilters().get(4).toString());
     assertEquals("POV(null,LIKE ,%\"'bla%)", conj.getFilters().get(5).toString());
   }
+
+  /**
+   * Test that brackets around 'has pname' do not cause filter to become subproperty filter.
+   *
+   * <p>https://gitlab.com/caosdb/caosdb-server/-/issues/203
+   */
+  @Test
+  public void testIssue203() {
+    // setup 203a
+    CQLLexer lexer;
+    lexer = new CQLLexer(CharStreams.fromString(this.issue203a));
+    CommonTokenStream tokens = new CommonTokenStream(lexer);
+    CQLParser parser = new CQLParser(tokens);
+    CqContext sfq = parser.cq();
+
+    // here we test that the filter stays a POV and is not falsly interpreted
+    // as subproperty filter
+    assertTrue(sfq.filter instanceof POV);
+
+    // setup 203b (with conjunction)
+    lexer = new CQLLexer(CharStreams.fromString(this.issue203b));
+    tokens = new CommonTokenStream(lexer);
+    parser = new CQLParser(tokens);
+    sfq = parser.cq();
+    Conjunction conj = (Conjunction) sfq.filter;
+
+    // the outer filter should be conjuction
+    assertTrue(sfq.filter instanceof Conjunction);
+    // here we test that the filters stays a POV and is not falsly interpreted
+    // as subproperty filters
+    assertTrue(conj.getFilters().get(0) instanceof POV);
+    assertTrue(conj.getFilters().get(1) instanceof POV);
+  }
 }