diff --git a/wcclrun/main.cpp b/wcclrun/main.cpp
index 4dacbd070ea47a554ca78ffd87dafaa520f15fbe..25cd57f31599d6a67af540cdea39760bb8f8d993 100644
--- a/wcclrun/main.cpp
+++ b/wcclrun/main.cpp
@@ -48,6 +48,9 @@ public:
 	}
 
 	bool load_more_operators(const std::string &filename);
+
+	bool load_operator_string(const std::string &op_string);
+
 	const std::vector< boost::shared_ptr<Wccl::FunctionalOperator> >& operators() const {
 		return ops_;
 	}
@@ -102,6 +105,27 @@ bool Runner::load_more_operators(const std::string& filename)
 	return false;
 }
 
+bool Runner::load_operator_string(const std::string& op_string)
+{
+	boost::shared_ptr<Wccl::FunctionalOperator> retOp;
+	try {
+		retOp = parser_.parseAnyOperator(op_string);
+		if (retOp) {
+			op_names_.push_back(op_string);
+			ops_.push_back(retOp);
+			return true;
+		} else {
+			std::cerr << "Problem while parsing -- "
+				<< "parser returned NULL!" << std::endl;
+		}
+	} catch (PwrNlp::PwrNlpError& e) {
+		std::cerr << e.scope() << " error: " << e.info() << std::endl;
+	} catch (antlr::ANTLRException& e) {
+		std::cerr << "Antlr error " << e.getMessage() << std::endl;
+	}
+	return false;
+}
+
 void Runner::do_sentence(const boost::shared_ptr<Corpus2::Sentence>& sentence)
 {
 	Wccl::SentenceContext sc(sentence);
@@ -197,7 +221,7 @@ int main(int argc, char** argv)
 {
 	std::string tagset_load = "kipi";
 	bool first = false;
-	std::vector<std::string> corpora_files, ccl_files, files;
+	std::vector<std::string> corpora_files, files, operator_strings;
 	bool corpus_stdin = false;
 	using boost::program_options::value;
 
@@ -207,8 +231,8 @@ int main(int argc, char** argv)
 			 "Tagset to use")
 			("corpus,c", value(&corpora_files),
 			 "Corpus file to load (XCES)")
-			("ccl-file,C", value(&ccl_files),
-			 "CCL query file")
+			("ccl-operator,C", value(&operator_strings),
+			 "CCL operator file or string")
 			("files,f", value(&files),
 			 "Files to load, looking at the extension to determine type")
 			("corpus-from-stdin,I", value(&corpus_stdin)->zero_tokens(),
@@ -248,7 +272,8 @@ int main(int argc, char** argv)
 	if (vm.count("help")) {
 		std::cerr << "Usage " << argv[0] << " [OPTIONS] FILES\n"
 			<< "Files ending with .xml are treated as corpora, otherwise \n"
-			<< "as CCL files. Use - to read corpus from stdin (as with -I)\n";
+			<< "as CCL files. Use - to read corpus from stdin (as with -I)\n"
+			<< "Files not ending with an extension are treated as raw operator strings\n";
 		std::cout << desc << "\n";
 		return 1;
 	}
@@ -259,23 +284,27 @@ int main(int argc, char** argv)
 		} else if (boost::algorithm::ends_with(f, ".xml")) {
 			corpora_files.push_back(f);
 		} else {
-			ccl_files.push_back(f);
+			operator_strings.push_back(f);
 		}
 	}
-	if (corpora_files.empty() || (ccl_files.empty() && !output_orths)) {
+	if (corpora_files.empty() || (operator_strings.empty() && !output_orths)) {
 		std::cerr << "Nothing to do, try " << argv[0] << " -h\n";
 		return 2;
 	}
 	try {
 		const Corpus2::Tagset& tagset = Corpus2::get_named_tagset(tagset_load);
 		Runner runner(tagset);
-		foreach (const std::string& f, ccl_files) {
-			size_t sz = runner.operators().size();
-			if (!runner.load_more_operators(f)) {
-				std::cerr << "Warning: error while parsing " << f << "\n";
-			}
-			if (runner.operators().size() == sz) {
-				std::cerr << "Warning: no operators loaded from " << f << "\n";
+		foreach (const std::string& f, operator_strings) {
+			if (boost::algorithm::ends_with(f, ".ccl")) {
+				size_t sz = runner.operators().size();
+				if (!runner.load_more_operators(f)) {
+					std::cerr << "Warning: error while parsing " << f << "\n";
+				}
+				if (runner.operators().size() == sz) {
+					std::cerr << "Warning: no operators loaded from " << f << "\n";
+				}
+			} else {
+				runner.load_operator_string(f);
 			}
 		}
 		if (!runner.operators().empty()) {