diff --git a/include/env.h b/include/env.h
index 7063564..0b2065f 100644
--- a/include/env.h
+++ b/include/env.h
@@ -4,11 +4,11 @@
 #include "ast.h"
 #include "lexer.h"
 
-typedef struct ht_t {
+struct ht_t {
 	char *name;
 	value_t value;
 	struct ht_t *enclosing;
-} ht_t;
+};
 
 #define DEFAULT_HT_SIZE 500
 
diff --git a/src/env.c b/src/env.c
index e7d957c..df5b59d 100644
--- a/src/env.c
+++ b/src/env.c
@@ -69,6 +69,9 @@ value_t *ht_get(ht_t *ht, token_t *name, int check_enclosing)
 			memcpy(val, &ht[probe_idx].value, sizeof(value_t));
 			if (val->type == VAL_STRING) {
 				val->as.string = strdup(ht[probe_idx].value.as.string);
+			} else if (val->type == VAL_FN) {
+				val->as.function = malloc(sizeof(fn_t));
+				memcpy(val->as.function, ht[probe_idx].value.as.function, sizeof(fn_t));
 			}
 
 			return val;
@@ -101,11 +104,16 @@ void ht_replace(ht_t *ht, char *name, value_t *value)
 		if (!strcmp(ht[probe_idx].name, name)) {
 			if (ht[probe_idx].value.type == VAL_STRING) {
 				free(ht[probe_idx].value.as.string);
+			} else if (ht[probe_idx].value.type == VAL_FN) {
+				free(ht[probe_idx].value.as.function);
 			}
 			ht[probe_idx].value.type = value->type;
 			ht[probe_idx].value.as = value->as;
 			if (value->type == VAL_STRING) {
 				ht[probe_idx].value.as.string = strdup(value->as.string);
+			} else if (value->type == VAL_FN) {
+				ht[probe_idx].value.as.function = malloc(sizeof(fn_t));
+				memcpy(ht[probe_idx].value.as.function, value->as.function, sizeof(fn_t));
 			}
 			return;
 		}
diff --git a/src/interpreter.c b/src/interpreter.c
index ac1dad4..1be02aa 100644
--- a/src/interpreter.c
+++ b/src/interpreter.c
@@ -26,7 +26,9 @@ void free_val(value_t *value)
 			free(value->as.string);
 		}
 	} else if (value->type == VAL_FN) {
-
+		if (value->as.function) {
+			free(value->as.function);
+		}
 	}
 	free(value);
 }
@@ -476,9 +478,7 @@ void evaluate_statement(stmt_t *stmt, ht_t *env, return_state_t *state)
 		}
 
 		case STMT_BLOCK:;
-			ht_t *cp_env = ht_init(env);
-			evaluate_block(stmt->as.block.statements, env, cp_env, state);
-/* 			ht_free(cp_env); */
+			evaluate_block(stmt->as.block.statements, env, ht_init(env), state);
 			break;
 
 		case STMT_WHILE:;
@@ -507,7 +507,6 @@ void evaluate_statement(stmt_t *stmt, ht_t *env, return_state_t *state)
 			fn_val->as.function = fn;
 			ht_add(env, stmt->as.function.name.value, fn_val);
 			free_val(fn_val);
-			free(fn);
 			break;
 		
 		case STMT_RETURN:;