diff --git a/src/hammer.c b/src/hammer.c
index 2bdc0d1d2e3789febb992b9d241ba2bf4df087fb..4d47ca069f12e3ec874f0a486c91ea8eebc7ae80 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -83,6 +83,7 @@ HParserBackendWithParams * h_copy_backend_with_params__m(HAllocator *mm__,
       if (r) {
         r->mm__ = mm__;
         r->name = be_with_params->name;
+        r->params_string = be_with_params->params_string;
         r->backend = be_with_params->backend;
         if (backends[be_with_params->backend]->copy_params) {
           s = backends[be_with_params->backend]->copy_params(mm__,
@@ -136,6 +137,8 @@ void h_free_backend_with_params(HParserBackendWithParams *be_with_params) {
       }
     }
 
+    h_free(be_with_params->name);
+    h_free(be_with_params->params_string);
     h_free(be_with_params);
   }
 }
@@ -332,11 +335,14 @@ char * h_get_short_name_with_no_params(HAllocator *mm__,
 char* get_params_as_string(char *remainder, char *end_paren,
 		char *params_as_string, HAllocator *mm__) {
 	char *after_open_paren = remainder + 1;
+
 	size_t params_len = strlen(after_open_paren) - strlen(end_paren);
+
 	if(params_len > 0) {
 		params_as_string = h_new(char, params_len + 1);
 		memset(params_as_string, '\0', params_len + 1);
 		strncpy(params_as_string, after_open_paren, params_len);
+
 	}
 	return params_as_string;
 }
@@ -360,8 +366,10 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi
 			remainder = strstr(name_with_params, "(");
 
 			if(remainder != NULL) {
+
 				name_len = len - strlen(remainder);
-				end_paren = strrchr(params_as_string, ')');
+				end_paren = strrchr(remainder, ')');
+
 				if(end_paren != NULL && end_paren != remainder +1) {
 					params_as_string = get_params_as_string(
 							remainder, end_paren, params_as_string, mm__);
@@ -379,6 +387,7 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi
 
 			result->backend = be;
 			result->name = name_with_no_params;
+			result->params_string = params_as_string;
 
 			/* use the backend supplied method to extract any params from the input */
 			result->params = NULL;
diff --git a/src/hammer.h b/src/hammer.h
index 1e866989076d99e77ca9985bf0288e3cfb6f6285..6cb92a83ca0b92fbab51fe74a9195ad6675cd608 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -54,10 +54,9 @@ typedef enum HParserBackend_ {
   PB_MAX = PB_GLR
 } HParserBackend;
 
-/*TODO double check which of my additions are needed for this change (as opposed to for the dlopen change)*/
 typedef struct HParserBackendWithParams_ {
-  /* Name of backend (if called via string, need to keep this for loading backends from modules)  */
-  const char *name;
+  /* Name of backend (if called via string, will need to keep this for loading backends with dlopen)  */
+  char *name;
   /* The backend (if backend is to be loaded from an external module set to invalid (?))*/
   HParserBackend backend;
   /*
@@ -67,6 +66,7 @@ typedef struct HParserBackendWithParams_ {
    * and PB_GLR take an integer cast to void *
    */
   void *params;
+  char * params_string;
   /* Allocator to use to free this (and the params if necessary) */
   HAllocator *mm__;
 } HParserBackendWithParams;
@@ -359,7 +359,6 @@ HParserBackend h_query_backend_by_name(const char *name);
  * If the backend is one of the existing backends in the HBackend enum,
  * HBackend will be populated in the result.
  *
- * TODO: actually do the below, also improve this comment to be more clear and concise.
  * Otherwise the result will save the name for use in attempts later at
  * loading the named module.
  *
diff --git a/src/t_names.c b/src/t_names.c
index b44ea70dcf90827ff05ac5f26a434b98f6d92893..5b91456eabd67b41fa5a7a547b29ea854110e67e 100644
--- a/src/t_names.c
+++ b/src/t_names.c
@@ -79,12 +79,6 @@ static void test_tt_get_backend_with_params_by_name(void) {
 	g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_INVALID);
 	g_check_maybe_string_eq(be_w_p->name, "llvm");
 
-    /*tests ahowing that the parsing of names and params as currently written is
-     * fault tolerant to things like calling a backend which does not take params
-     * with params, sending extra params, or plain old garbage after the name or
-     * the valid params.
-     * If we choose to enforce sanity checks on input, these are the tests we should see
-     * break and then change to reflect those sanity checks*/
     be_w_p = h_get_backend_with_params_by_name("packrat(0)");
     g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_PACKRAT);
     g_check_maybe_string_eq(be_w_p->name, packrat_name);
@@ -94,7 +88,7 @@ static void test_tt_get_backend_with_params_by_name(void) {
 	g_check_maybe_string_eq(be_w_p->name, glr_name);
 	g_check_cmp_size((uintptr_t)be_w_p->params, ==, 1);
 
-	be_w_p = h_get_backend_with_params_by_name("glr(1 vnvnvn");
+	be_w_p = h_get_backend_with_params_by_name("glr(1 vnvnvn)");
 	g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_GLR);
 	g_check_maybe_string_eq(be_w_p->name, glr_name);
 	g_check_cmp_size((uintptr_t)be_w_p->params, ==, 1);
@@ -103,6 +97,10 @@ static void test_tt_get_backend_with_params_by_name(void) {
 	g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_GLR);
 	g_check_maybe_string_eq(be_w_p->name, glr_name);
 
+	be_w_p = h_get_backend_with_params_by_name("glr(2");
+	g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_GLR);
+	g_check_maybe_string_eq(be_w_p->name, glr_name);
+
 }
 
 /* test that we can request a backend with params from character