diff --git a/conf/cf-lex.l b/conf/cf-lex.l
index ca7bfae1..94c2b2ab 100644
--- a/conf/cf-lex.l
+++ b/conf/cf-lex.l
@@ -182,6 +182,12 @@ cf_find_sym(byte *c, unsigned int h0)
   return s;
 }
 
+struct symbol *
+cf_find_symbol(byte *c)
+{
+  return cf_find_sym(c, cf_hash(c));
+}
+
 struct symbol *
 cf_default_name(char *prefix, int *counter)
 {
@@ -198,6 +204,15 @@ cf_default_name(char *prefix, int *counter)
   return s;
 }
 
+void
+cf_define_symbol(struct symbol *sym, int type, void *def)
+{
+  if (sym->class)
+    cf_error("Symbol already defined");
+  sym->class = type;
+  sym->def = def;
+}
+
 void
 cf_lex_init(int flag)
 {
diff --git a/conf/conf.h b/conf/conf.h
index 83d92c3f..86043245 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -17,6 +17,8 @@ struct config {
   pool *pool;				/* Pool the configuration is stored in */
   linpool *mem;				/* Linear pool containing configuration data */
   list protos;				/* Configured protocol instances (struct proto_config) */
+  list tables;				/* Configured routing tables (struct rtable_config) */
+  struct rtable_config *master_rtc;	/* Configuration of master routing table */
   u32 router_id;			/* Our Router ID */
   char *err_msg;			/* Parser error message */
   int err_lino;				/* Line containing error */
@@ -60,6 +62,7 @@ struct symbol {
 #define SYM_STAT 3 /* statement */
 #define SYM_FUNCTION 5
 #define SYM_FILTER 6
+#define SYM_TABLE 7
 
 #define SYM_VARIABLE 0x100	/* Reserved 0x100..0x1ff */
 
@@ -68,7 +71,9 @@ extern int conf_lino;
 void cf_lex_init_tables(void);
 int cf_lex(void);
 void cf_lex_init(int flag);
+struct symbol *cf_find_symbol(byte *c);
 struct symbol *cf_default_name(char *prefix, int *counter);
+void cf_define_symbol(struct symbol *symbol, int type, void *def);
 
 /* Parser */
 
diff --git a/filter/config.Y b/filter/config.Y
index 4fd18157..c7f20148 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -40,9 +40,7 @@ CF_GRAMMAR
 CF_ADDTO(conf, filter_def)
 filter_def:
    FILTER SYM filter_body {
-     if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
-     $2->class = SYM_FILTER;
-     $2->def = $3;
+     cf_define_symbol($2, SYM_FILTER, $3);
      $3->name = $2->name;
      printf( "We have new filter defined (%s)\n", $2->name )
    }
@@ -67,8 +65,7 @@ type:
 
 decls: /* EMPTY */
  | type SYM ';' decls {
-     if ($2->class != SYM_VOID) cf_error("Symbol already defined, can not use as variable\n" );
-     $2->class = SYM_VARIABLE | $1;
+     cf_define_symbol($2, SYM_VARIABLE | $1, NULL);
      printf( "New variable %s type %x\n", $2->name, $1 );
    }
  ;
@@ -104,9 +101,7 @@ CF_ADDTO(conf, function_def)
 function_def:
    FUNCTION SYM function_params function_body {
      extern struct f_inst *startup_func;
-     if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
-     $2->class = SYM_FUNCTION;
-     $2->def = $4;
+     cf_define_symbol($2, SYM_FUNCTION, $4);
      if (!strcasecmp($2->name, "startup"))
 	startup_func = $4;
      printf("Hmm, we've got one function here - %s\n", $2->name);