diff --git a/refpolicy/Changelog b/refpolicy/Changelog
index 6c1fe19..95edd9a 100644
--- a/refpolicy/Changelog
+++ b/refpolicy/Changelog
@@ -1,3 +1,4 @@
+- Add check for duplicate interface/template definitions.
 - Move domain, files, and corecommands modules to kernel
   layer to resolve some layering inconsistencies.
 - Move policy build options out of Makefile into build.conf.
diff --git a/refpolicy/policy/support/loadable_module.spt b/refpolicy/policy/support/loadable_module.spt
index 308dcb6..77b41a9 100644
--- a/refpolicy/policy/support/loadable_module.spt
+++ b/refpolicy/policy/support/loadable_module.spt
@@ -25,57 +25,57 @@ define(`policy_module',`
 #
 define(`gen_require',`
 	ifdef(`self_contained_policy',`',`
-		define(`in_gen_require_block')
 		require {
 			$1
 		}
-		undefine(`in_gen_require_block')
 	')
 ')
 
+# helper function, since m4 wont expand macros
+# if a line is a comment (#):
+define(`policy_m4_comment',`
+##### $2 depth: $1
+')dnl
+
 ##############################
 #
 # In the future interfaces should be in loadable modules
 #
 # template(name,rules)
 #
-define(`template',`
-	`define(`$1',`
-##### begin $1(dollarsstar)
-		$2
-##### end $1(dollarsstar)
+define(`template',` dnl
+	ifdef(`$1',`errprint(__file__:__line__`: duplicate definition of $1(). Original definition on '$1. __endline__)',`define(`$1',__line__)') dnl
+	`define(`$1',` dnl
+	define(`policy_temp',incr(policy_call_depth)) dnl
+	pushdef(`policy_call_depth',policy_temp) dnl
+	undefine(`policy_temp') dnl
+	policy_m4_comment(policy_call_depth,begin `$1'(dollarsstar)) dnl
+	$2 dnl
+	define(`policy_temp',decr(policy_call_depth)) dnl
+	pushdef(`policy_call_depth',policy_temp) dnl
+	undefine(`policy_temp') dnl
+	policy_m4_comment(policy_call_depth,end `$1'(dollarsstar)) dnl
 	'')
 ')
 
-# helper function, since m4 wont expand macros
-# if a line is a comment (#):
-define(`policy_m4_comment',`dnl
-##### $2 depth: $1
-')dnl
-
 ##############################
 #
 # In the future interfaces should be in loadable modules
 #
 # interface(name,rules)
 #
-define(`interface',`
-	`define(`$1',`
-
-	define(`policy_temp',incr(policy_call_depth))
-	pushdef(`policy_call_depth',policy_temp)
-	undefine(`policy_temp')
-
-	policy_m4_comment(policy_call_depth,begin `$1'(dollarsstar))
-
+define(`interface',` dnl
+	ifdef(`$1',`errprint(__file__:__line__`: duplicate definition of $1(). Original definition on '$1. __endline__)',`define(`$1',__line__)') dnl
+	`define(`$1',` dnl
+	define(`policy_temp',incr(policy_call_depth)) dnl
+	pushdef(`policy_call_depth',policy_temp) dnl
+	undefine(`policy_temp') dnl
+	policy_m4_comment(policy_call_depth,begin `$1'(dollarsstar)) dnl
 	$2
-
-	define(`policy_temp',decr(policy_call_depth))
-	pushdef(`policy_call_depth',policy_temp)
-	undefine(`policy_temp')
-
-	policy_m4_comment(policy_call_depth,end `$1'(dollarsstar))
-
+	define(`policy_temp',decr(policy_call_depth)) dnl
+	pushdef(`policy_call_depth',policy_temp) dnl
+	undefine(`policy_temp') dnl
+	policy_m4_comment(policy_call_depth,end `$1'(dollarsstar)) dnl
 	'')
 ')
 
@@ -145,8 +145,10 @@ define(`tunable_policy',`
 	ifdef(`self_contained_policy',`
 		if (`$1') {
 			$2
+		ifelse(`$3',`',`',`
 		} else {
 			$3
+		')
 		}
 	',`
 		# structure for tunables
@@ -159,8 +161,10 @@ define(`tunable_policy',`
 
 		if (`$1') {
 			$2
+		ifelse(`$3',`',`',`
 		} else {
 			$3
+		')
 		}
 	')
 ')