diff --git a/Changes b/Changes
index 829a7cc..36be4ab 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,7 @@
+0.45 2025-05-23
+	- [bugfix] Fix running QuerySerializer via commandline 
+	- [feature] Add serializing corpus query via commandline
+
 0.44 2024-07-12
     - [security] Dependencies updated
 
diff --git a/pom.xml b/pom.xml
index 1d31d08..496551a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 
 	<groupId>de.ids-mannheim.korap.koral</groupId>
 	<artifactId>Koral</artifactId>
-	<version>0.44.0</version>
+	<version>0.45</version>
 	<packaging>jar</packaging>
 	<name>Koral</name>
 	<url>https://korap.ids-mannheim.de</url>
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java b/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java
index a51bae1..2e31060 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java
@@ -175,13 +175,15 @@
         else if (queryLanguage.equalsIgnoreCase("annis")) {
             ast = new AnnisQueryProcessor(query);
         }
+        else if (queryLanguage.equalsIgnoreCase("cq")) {
+            ast = new CollectionQueryProcessor(query);
+        }
         else {
             throw new IllegalArgumentException(
                     queryLanguage + " is not a supported query language!");
         }
         
-        if( bDebug )
-        	System.out.println(this.toJSON());
+		System.out.println(this.toJSON());
     }
 
     public QuerySerializer setQuery (String query, String ql, String version) {
@@ -219,6 +221,9 @@
         else if (ql.equalsIgnoreCase("annis")) {
             ast = new AnnisQueryProcessor(query);
         }
+        else if (ql.equalsIgnoreCase("cq")) {
+            ast = new CollectionQueryProcessor(query);
+        }
         else {
             ast.addError(StatusCodes.UNKNOWN_QUERY_LANGUAGE,
                     ql + " is not a supported query language!");
diff --git a/src/test/java/de/ids_mannheim/korap/query/test/QuerySerializerTest.java b/src/test/java/de/ids_mannheim/korap/query/test/QuerySerializerTest.java
new file mode 100644
index 0000000..c5e5e87
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/query/test/QuerySerializerTest.java
@@ -0,0 +1,82 @@
+package de.ids_mannheim.korap.query.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import org.junit.Test;
+
+import de.ids_mannheim.korap.query.serialize.QuerySerializer;
+
+public class QuerySerializerTest {
+
+	@Test
+	public void serializePoliqarp () {
+		// Backup the original System.out
+		PrintStream originalOut = System.out;
+
+		// Create a stream to hold the output
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		System.setOut(new PrintStream(outputStream));
+
+		String query = "Sonne";
+		String ql = "poliqarp";
+		String[] args = { query, ql };
+		QuerySerializer.main(args);
+
+		System.setOut(originalOut);
+		String expectedOutput = "{\"query\":{\"@type\":\"koral:token\","
+				+ "\"wrap\":{\"@type\":\"koral:term\",\"match\":"
+				+ "\"match:eq\",\"layer\":\"orth\",\"key\":\"Sonne\"}},"
+				+ "\"@context\":\"http://korap.ids-mannheim.de/ns/koral"
+				+ "/0.3/context.jsonld\"}\n" + System.lineSeparator();
+		assertEquals(expectedOutput, outputStream.toString());
+	}
+	
+	@Test
+	public void serializeFCSQL () {
+		// Backup the original System.out
+		PrintStream originalOut = System.out;
+
+		// Create a stream to hold the output
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		System.setOut(new PrintStream(outputStream));
+
+		String query = "\"Sonne\"";
+		String ql = "fcsql";
+		String[] args = { query, ql };
+		QuerySerializer.main(args);
+
+		System.setOut(originalOut);
+		String expectedOutput = "{\"query\":{\"@type\":\"koral:token\","
+				+ "\"wrap\":{\"@type\":\"koral:term\",\"key\":\"Sonne\","
+				+ "\"foundry\":\"opennlp\",\"layer\":\"orth\",\"type\":"
+				+ "\"type:regex\",\"match\":\"match:eq\"}},\"@context\":"
+				+ "\"http://korap.ids-mannheim.de/ns/koral/0.3/"
+				+ "context.jsonld\"}\n" + System.lineSeparator();
+		assertEquals(expectedOutput, outputStream.toString());
+	}
+	
+	@Test
+	public void serializeCorpusQuery () {
+		// Backup the original System.out
+		PrintStream originalOut = System.out;
+
+		// Create a stream to hold the output
+		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+		System.setOut(new PrintStream(outputStream));
+
+		String query = "corpusSigle=WPD17";
+		String ql = "cq";
+		String[] args = { query, ql };
+		QuerySerializer.main(args);
+
+		System.setOut(originalOut);
+		String expectedOutput = "{\"collection\":{\"@type\":\"koral:doc\","
+				+ "\"match\":\"match:eq\",\"value\":\"WPD17\",\"key\":"
+				+ "\"corpusSigle\"},\"@context\":\"http://korap.ids-mannheim.de"
+				+ "/ns/koral/0.3/context.jsonld\"}\n" + System.lineSeparator();
+		assertEquals(expectedOutput, outputStream.toString());
+	}
+}
