diff --git a/docs/modelists/channel-modes.csv b/docs/modelists/channel-modes.csv
index 0baa9e3..d8ff8a5 100644
--- a/docs/modelists/channel-modes.csv
+++ b/docs/modelists/channel-modes.csv
@@ -23,7 +23,8 @@ inviteonly,i,i,i,i,i,i,i,i,i,i,i,i
issecure,,,,,,,,,,,,Z
joinflood,,,j (m_joinflood),,,,,j,j,j,,
key,k,k,k,k,k,k,k,k,k,k,k,k
-kicknorejoin,,,J (m_kicknorejoin),,,,,,,J,,
+kicknorejoin,,,,,,,,,,J,,
+kicknorejoin_insp,,,J (m_kicknorejoin),,,,,,,,,
largebanlist,,,,,,,,L,L,L,,
limit,l,l,l,l,l,l,l,l,l,l,l,l
moderated,m,m,m,m,m,m,m,m,m,m,m,m
@@ -53,7 +54,8 @@ redirect,,,L (m_redirect),,,L,,f,f,f,,L
registered,,r,r (m_services_account),r,R,R,R,,,,,r
regmoderated,,M,M (m_services_account),M,,M,M,,,,,M
regonly,,R,R (m_services_account),R,r,r,r,r,r,r,r,R
-repeat,,,E (m_repeat),,,,,,,K (ext/chm_norepeat.c),,
+repeat,,,,,,,,,,K (ext/chm_norepeat.c),,
+repeat_insp,,,E (m_repeat),,,,,,,,,
secret,s,s,s,s,s,s,s,s,s,s,s,s
sslonly,,S,z (m_sslmodes),z,,,,S (ext/chm_sslonly),S (ext/chm_sslonly),S (ext/chm_sslonly.c),S,z
stripcolor,,,S (m_stripcolor),,,S,,c,c,c,,S
diff --git a/docs/modelists/channel-modes.html b/docs/modelists/channel-modes.html
index 2f2e655..fa6b276 100644
--- a/docs/modelists/channel-modes.html
+++ b/docs/modelists/channel-modes.html
@@ -160,7 +160,10 @@ td:first-child, th[scope="row"] {
+k | +k | +k | +k | +k | +k | +k | +k | +k | +k | +k | +k |
kicknorejoin |
-n/a | n/a | +J (m_kicknorejoin) | n/a | n/a | n/a | n/a | n/a | n/a | +J | n/a | n/a |
+n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +J | n/a | n/a |
+
+kicknorejoin_insp |
+n/a | n/a | +J (m_kicknorejoin) | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
largebanlist |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | +L | +L | +L | n/a | n/a |
@@ -250,7 +253,10 @@ td:first-child, th[scope="row"] {
n/a | +R | +R (m_services_account) | +R | +r | +r | +r | +r | +r | +r | +r | +R |
repeat |
-n/a | n/a | +E (m_repeat) | n/a | n/a | n/a | n/a | n/a | n/a | +K (ext/chm_norepeat.c) | n/a | n/a |
+n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | +K (ext/chm_norepeat.c) | n/a | n/a |
+
+repeat_insp |
+n/a | n/a | +E (m_repeat) | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
secret |
+s | +s | +s | +s | +s | +s | +s | +s | +s | +s | +s | +s |
diff --git a/protocols/inspircd.py b/protocols/inspircd.py
index 98adc5e..dd0d43e 100644
--- a/protocols/inspircd.py
+++ b/protocols/inspircd.py
@@ -452,7 +452,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
# Strip c_ prefixes to be consistent with other protocols.
name = name.lstrip('c_')
- if name == 'reginvite': # Reginvite? That's a dumb name.
+ if name == 'reginvite': # Reginvite? That's an odd name.
name = 'regonly'
if name == 'founder': # Channel mode +q
@@ -461,6 +461,11 @@ class InspIRCdProtocol(TS6BaseProtocol):
# but I personally prefer the latter.
name = 'owner'
+ if name in ('repeat', 'kicknorejoin'):
+ # Suffix modes using inspircd-specific arguments so that it can
+ # be safely relayed.
+ name += '_insp'
+
# We don't care about mode prefixes; just the mode char.
self.cmodes[name] = char[-1]