diff --git a/include/freeDiameter/extension.h b/include/freeDiameter/extension.h
new file mode 100644
index 0000000..1d6ea7f
--- /dev/null
+++ b/include/freeDiameter/extension.h
@@ -0,0 +1,103 @@
+/*********************************************************************************************************
+* Software License Agreement (BSD License)                                                               *
+* Author: Sebastien Decugis <sdecugis@freediameter.net>							 *
+*													 *
+* Copyright (c) 2013, WIDE Project and NICT								 *
+* All rights reserved.											 *
+* 													 *
+* Redistribution and use of this software in source and binary forms, with or without modification, are  *
+* permitted provided that the following conditions are met:						 *
+* 													 *
+* * Redistributions of source code must retain the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer.										 *
+*    													 *
+* * Redistributions in binary form must reproduce the above 						 *
+*   copyright notice, this list of conditions and the 							 *
+*   following disclaimer in the documentation and/or other						 *
+*   materials provided with the distribution.								 *
+* 													 *
+* * Neither the name of the WIDE Project or NICT nor the 						 *
+*   names of its contributors may be used to endorse or 						 *
+*   promote products derived from this software without 						 *
+*   specific prior written permission of WIDE Project and 						 *
+*   NICT.												 *
+* 													 *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
+* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 	 *
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 	 *
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
+* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
+* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
+*********************************************************************************************************/
+
+#ifndef _EXTENSION_H
+#define _EXTENSION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Include definition of freeDiameter API */
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+
+/* Macro that define the entry point of the extension */
+#define EXTENSION_ENTRY(_name, _function, _depends...)					\
+const char *fd_ext_depends[] = { _name , ## _depends , NULL };				\
+static int extension_loaded = 0;							\
+int fd_ext_init(int major, int minor, char * conffile) {				\
+	if ((major != FD_PROJECT_VERSION_MAJOR)						\
+		|| (minor != FD_PROJECT_VERSION_MINOR)) {				\
+		TRACE_ERROR("This extension (" _name ") was compiled for a different version of freeDiameter.");	\
+		TRACE_DEBUG(INFO, "daemon %d.%d != ext %d.%d",				\
+			major, minor,							\
+			FD_PROJECT_VERSION_MAJOR, FD_PROJECT_VERSION_MINOR);		\
+		return EINVAL;								\
+	}										\
+	if (extension_loaded) {								\
+		TRACE_ERROR("Extension (" _name ") cannot be loaded twice!");		\
+		return ENOTSUP;								\
+	}										\
+	LOG_N("Loading (" _name ") extension.");					\
+	return (_function)(conffile);							\
+}						
+    
+#define EXTENSION_ENTRY2(_name, _dictfunc, _rulesfunction, _depends...)					\
+EXTENSION_ENTRY(_name, _dictfunc, ## _depends )					\
+int fd_ext_init2(int major, int minor, char * conffile) {				\
+    if ((major != FD_PROJECT_VERSION_MAJOR)						\
+        || (minor != FD_PROJECT_VERSION_MINOR)) {				\
+        TRACE_ERROR("This extension (" _name ") was compiled for a different version of freeDiameter.");	\
+        TRACE_DEBUG(INFO, "daemon %d.%d != ext %d.%d",				\
+            major, minor,							\
+            FD_PROJECT_VERSION_MAJOR, FD_PROJECT_VERSION_MINOR);		\
+        return EINVAL;								\
+    }										\
+    if (extension_loaded) {								\
+        TRACE_ERROR("Extension (" _name ") cannot be loaded twice!");		\
+        return ENOTSUP;								\
+    }										\
+    extension_loaded++;								\
+    return (_rulesfunction)(conffile);							\
+}							\
+int fd_ext_parselocalrules(char *conffile) {					\
+    return (_rulesfunction)(conffile);					\
+}									
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _EXTENSION_H */
+
+#if 0
+static int dict_entry(char * conffile)                                  
+{                                       
+        int x = (_dictfunc)(conffile);                                  \
+        if (x != 0) return x;                                   \
+        return (_rulesfunction)(conffile);                                      \
+} 
+#endif
