diff --git a/CHANGELOG.md b/CHANGELOG.md
index a10cb0ccde2072f90c2bdd42d701fdfce1478adb..73433a48ceb379ffc792b86613ecdbf158793727 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)
 
 * Searching for values in scientific notation
   [#143](https://gitlab.com/caosdb/caosdb-server/-/issues/143)
diff --git a/src/main/java/org/caosdb/server/query/CQLParser.g4 b/src/main/java/org/caosdb/server/query/CQLParser.g4
index eb43e17be1fc7b4161a72124ceb3b583588ca5e1..d62b0eaa1ed86dcae86e7a721d204d5883b41b53 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 50f96f6f8bdd856313c5923ffcac1c2e220028dd..a2f055d33ef17f3b9bed1d47fca8349c2d28c4db 100644
--- a/src/test/java/org/caosdb/server/query/TestCQL.java
+++ b/src/test/java/org/caosdb/server/query/TestCQL.java
@@ -285,6 +285,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()
@@ -7063,5 +7065,37 @@ public class TestCQL {
 
     final CQLParser parser = new CQLParser(tokens);
     assertThrowsExactly(Query.ParsingException.class, () -> parser.cq());
+
+  /**
+   * 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);
   }
 }