*** main/devicestate.c.org	2018-05-03 02:12:43.507582798 +0900
--- main/devicestate.c	2018-05-03 02:19:56.988391192 +0900
***************
*** 281,286 ****
--- 281,288 ----
  		return AST_DEVICE_RINGINUSE;
  	else if (!strcasecmp(val, "ONHOLD"))
  		return AST_DEVICE_ONHOLD;
+ 	else if (!strcasecmp(val, "IUSE"))
+ 		return AST_DEVICE_IUSE;
  
  	return AST_DEVICE_UNKNOWN;
  }
*** main/pbx.c.org	2018-05-04 03:30:51.362615974 +0900
--- main/pbx.c	2018-05-02 17:52:54.314382832 +0900
***************
*** 613,619 ****
  	{ AST_EXTENSION_RINGING,                       "Ringing" },
  	{ AST_EXTENSION_INUSE | AST_EXTENSION_RINGING, "InUse&Ringing" },
  	{ AST_EXTENSION_ONHOLD,                        "Hold" },
! 	{ AST_EXTENSION_INUSE | AST_EXTENSION_ONHOLD,  "InUse&Hold" }
  };
  
  struct pbx_exception {
--- 613,620 ----
  	{ AST_EXTENSION_RINGING,                       "Ringing" },
  	{ AST_EXTENSION_INUSE | AST_EXTENSION_RINGING, "InUse&Ringing" },
  	{ AST_EXTENSION_ONHOLD,                        "Hold" },
! 	{ AST_EXTENSION_INUSE | AST_EXTENSION_ONHOLD,  "InUse&Hold" },
! 	{ AST_EXTENSION_IUSE,  "I-use" }
  };
  
  struct pbx_exception {
***************
*** 3000,3005 ****
--- 3001,3008 ----
  		return AST_EXTENSION_INUSE;
  	case AST_DEVICE_NOT_INUSE:
  		return AST_EXTENSION_NOT_INUSE;
+ 	case AST_DEVICE_IUSE:
+ 		return AST_EXTENSION_IUSE;
  	case AST_DEVICE_TOTAL: /* not a device state, included for completeness */
  		break;
  	}
***************
*** 3291,3296 ****
--- 3294,3300 ----
  			break;
  		case AST_DEVICE_ONHOLD:
  		case AST_DEVICE_INUSE:
+ 		case AST_DEVICE_IUSE:
  			/* find up channel */
  			search_state = AST_STATE_UP;
  			break;
*** funcs/func_extstate.c.org	2018-05-03 02:14:00.737726110 +0900
--- funcs/func_extstate.c	2018-05-03 02:20:04.158404643 +0900
***************
*** 56,62 ****
  			<para>NoOp(4567@home has state ${EXTENSION_STATE(4567@home)})</para>
  			<para>The possible values returned by this function are:</para>
  			<para>UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING |
! 			RINGINUSE | HOLDINUSE | ONHOLD</para>
  		</description>
  	</function>
   ***/
--- 56,62 ----
  			<para>NoOp(4567@home has state ${EXTENSION_STATE(4567@home)})</para>
  			<para>The possible values returned by this function are:</para>
  			<para>UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING |
! 			RINGINUSE | HOLDINUSE | ONHOLD | IUSE</para>
  		</description>
  	</function>
   ***/
***************
*** 90,95 ****
--- 90,98 ----
  	case AST_EXTENSION_ONHOLD:
  		res = "ONHOLD";
  		break;
+ 	case AST_EXTENSION_IUSE:
+ 		res = "IUSE";
+ 		break;
  	}
  
  	return res;
*** funcs/func_devstate.c.org	2018-05-04 02:34:34.306185625 +0900
--- funcs/func_devstate.c	2018-05-03 02:20:09.278414250 +0900
***************
*** 68,74 ****
  			<para>exten => 1234,hint,Custom:lamp1</para>
  			<para>The possible values for both uses of this function are:</para>
  			<para>UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING |
! 			RINGINUSE | ONHOLD</para>
  		</description>
  	</function>
  	<function name="HINT" language="en_US">
--- 68,74 ----
  			<para>exten => 1234,hint,Custom:lamp1</para>
  			<para>The possible values for both uses of this function are:</para>
  			<para>UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING |
! 			RINGINUSE | ONHOLD | IUSE</para>
  		</description>
  	</function>
  	<function name="HINT" language="en_US">
***************
*** 249,255 ****
  			"       Change a custom device to a new state.\n"
  			"       The possible values for the state are:\n"
  			"UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING\n"
! 			"RINGINUSE | ONHOLD\n"
  			"\n"
  			"Examples:\n"
  			"       devstate change Custom:mystate1 INUSE\n"
--- 249,255 ----
  			"       Change a custom device to a new state.\n"
  			"       The possible values for the state are:\n"
  			"UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING\n"
! 			"RINGINUSE | ONHOLD | IUSE\n"
  			"\n"
  			"Examples:\n"
  			"       devstate change Custom:mystate1 INUSE\n"
***************
*** 259,265 ****
  	case CLI_GENERATE:
  	{
  		static const char * const cmds[] = { "UNKNOWN", "NOT_INUSE", "INUSE", "BUSY",
! 						     "UNAVAILABLE", "RINGING", "RINGINUSE", "ONHOLD", NULL };
  
  		if (a->pos == e->args + 1)
  			return ast_cli_complete(a->word, cmds, a->n);
--- 259,265 ----
  	case CLI_GENERATE:
  	{
  		static const char * const cmds[] = { "UNKNOWN", "NOT_INUSE", "INUSE", "BUSY",
! 						     "UNAVAILABLE", "RINGING", "RINGINUSE", "ONHOLD", "IUSE", NULL };
  
  		if (a->pos == e->args + 1)
  			return ast_cli_complete(a->word, cmds, a->n);
*** include/asterisk/pbx.h.org	2018-05-03 02:14:53.787824736 +0900
--- include/asterisk/pbx.h	2018-05-03 02:20:20.438435194 +0900
***************
*** 67,72 ****
--- 67,73 ----
  	AST_EXTENSION_UNAVAILABLE = 1 << 2, /*!< All devices UNAVAILABLE/UNREGISTERED */
  	AST_EXTENSION_RINGING = 1 << 3,	/*!< All devices RINGING */
  	AST_EXTENSION_ONHOLD = 1 << 4,	/*!< All devices ONHOLD */
+ 	AST_EXTENSION_IUSE = 1 << 5,	/*!< All devices IUSE */
  };
  
  /*!
*** include/asterisk/devicestate.h.org	2018-05-03 02:15:25.167883144 +0900
--- include/asterisk/devicestate.h	2018-05-03 02:20:28.288449929 +0900
***************
*** 59,64 ****
--- 59,65 ----
  	AST_DEVICE_RINGING,      /*!< Device is ringing */
  	AST_DEVICE_RINGINUSE,    /*!< Device is ringing *and* in use */
  	AST_DEVICE_ONHOLD,       /*!< Device is on hold */
+ 	AST_DEVICE_IUSE,        /*!< Device is i-use (panasonic) */
  	AST_DEVICE_TOTAL,        /*!< Total num of device states, used for testing */
  };
  
*** channels/chan_sip.c.org	2018-05-03 02:15:56.917942293 +0900
--- channels/chan_sip.c	2018-05-03 02:20:34.568461720 +0900
***************
*** 15122,15127 ****
--- 15122,15133 ----
  		pidfstate = "busy";
  		pidfnote = "On hold";
  		break;
+ 	case AST_EXTENSION_IUSE:
+ 		statestring = "I-use";
+ 		local_state = NOTIFY_INUSE;
+ 		pidfstate = "busy";
+ 		pidfnote = "I-use";
+ 		break;
  	case AST_EXTENSION_NOT_INUSE:
  	default:
  		/* Default setting */