diff --git a/.gitignore b/.gitignore
index d8c2c5a..e3b3f2c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
 /bee-query.sh
 /bee-remove.sh
 /beecut
+/beeuniq
 /beefind.pl
 /beesep
 /beesh.sh
diff --git a/Makefile b/Makefile
index 31641a9..bb8d2d9 100644
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ DEFCONFDIR=${SYSCONFDIR}/default
 
 DESTDIR=
 
-PROGRAMS_C=beeversion beesep beecut
+PROGRAMS_C=beeversion beesep beecut beeuniq
 PROGRAMS_SHELL=bee beesh
 PROGRAMS_PERL=beefind.pl
 
@@ -71,6 +71,10 @@ beecut: src/beecut/beecut.c
 	@echo "linking $@ .."
 	@gcc -Wall -o $@ $^
 
+beeuniq: src/beeuniq/beeuniq.c
+	@echo "linking $@ .."
+	@gcc -Wall -o $@ $^
+
 %.o: %.c
 	@echo "compiling $@ .."
 	@gcc -Wall -o $@ -c $^
diff --git a/src/beelib.config.sh.in b/src/beelib.config.sh.in
index 7db42c3..bca4fcb 100644
--- a/src/beelib.config.sh.in
+++ b/src/beelib.config.sh.in
@@ -45,6 +45,10 @@ function config_init_base_config() {
     # append bee installed defaults to config search path
     : ${BEE_CONFIG_DIR:=${BEE_DEFCONFDIR}}
     XDG_CONFIG_DIRS=${XDG_CONFIG_DIRS}:${BEE_CONFIG_DIR}
+
+    # remove dupes from pathes
+    XDG_CONFIG_DIRS=$(beeuniq -d : ${XDG_CONFIG_DIRS//:/ })
+    XDG_DATA_DIRS=$(beeuniq -d : ${XDG_DATA_DIRS//:/ })
 }
 
 function config_handle_deprecated_config() {
diff --git a/src/beeuniq/beeuniq.c b/src/beeuniq/beeuniq.c
new file mode 100644
index 0000000..159872d
--- /dev/null
+++ b/src/beeuniq/beeuniq.c
@@ -0,0 +1,135 @@
+/*
+** beeuniq - filter duplicate command line arguments
+** Copyright (C) 2010-2011
+**       Marius Tolzmann <tolzmann@molgen.mpg.de>
+**
+** This file is part of Bee.
+**
+** Bee is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation, either version 3 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <string.h>
+
+#define VERSION_MAJOR    0
+#define VERSION_MINOR    1
+#define VERSION_PATCHLVL 0
+
+#define OPT_DELIMITER 'd'
+#define OPT_VERSION   'v'
+#define OPT_HELP      'h'
+
+void print_version(void)
+{
+    printf("beeuniq v%d.%d.%d - "
+           "by Marius Tolzmann <tolzmann@molgen.mpg.de> 2011\n",
+             VERSION_MAJOR, VERSION_MINOR, VERSION_PATCHLVL);
+}
+
+void print_full_usage(void)
+{
+    printf("usage: beeuniq [options] <string>\n\n");
+    printf("options:\n\n");
+    printf("  -d | --delimiter <char>  specify the outputdelimiter character\n\n");
+}
+
+char in(char *search, char *strings[], int max)
+{
+   int i;
+
+   for(i=0; i < max ; i++)
+       if(!strcmp(search, strings[i]))
+           return 1;
+
+   return 0;
+}
+
+int bee_uniq(int count, char *strings[])
+{
+    int i = 0;
+    int ret;
+
+    for(i=1, ret=count; i < ret ; i++) {
+        if(!in(strings[i], strings, i))
+            continue;
+
+        ret--;
+        memmove(&strings[i], &strings[i+1], sizeof(*strings)*(ret-i));
+        i--;
+    }
+
+    return ret;
+}
+
+int main(int argc, char *argv[])
+{
+    int  option_index = 0;
+    int  c = 0;
+    int  max, i;
+
+    char delimiter = ' ';
+
+    struct option long_options[] = {
+        {"delimiter",   required_argument, 0, OPT_DELIMITER},
+
+        {"version",     no_argument, 0, OPT_VERSION},
+        {"help",        no_argument, 0, OPT_HELP},
+
+        {0, 0, 0, 0}
+    };
+
+    while ((c = getopt_long_only(argc, argv, "hv", long_options, &option_index)) != -1) {
+
+        switch (c) {
+            case OPT_DELIMITER:
+                if (!optarg[0] || optarg[1]) {
+                     fprintf(stderr, "invalid delimiter '%s'\n", optarg);
+                     exit(EXIT_FAILURE);
+                }
+                delimiter = optarg[0];
+                break;
+
+            case OPT_HELP:
+                print_version();
+                printf("\n");
+                print_full_usage();
+                printf("\n");
+                exit(EXIT_SUCCESS);
+
+            case OPT_VERSION:
+                print_version();
+                exit(EXIT_SUCCESS);
+        }
+    }  /* end while getopt_long_only */
+
+    if(argc-optind < 1) {
+        print_full_usage();
+        exit(EXIT_FAILURE);
+    }
+
+    max  = bee_uniq(argc-optind, &argv[optind]);
+    max += optind-1;
+
+    for(i=optind; i <= max; i++) {
+        fputs(argv[i], stdout);
+        if(max-i)
+            putchar(delimiter);
+    }
+
+    putchar('\n');
+
+    return(EXIT_SUCCESS);
+}