Ethereal-dev: [Ethereal-dev] packet-skinny.c updates

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: "Paul E. Erkkila" <pee@xxxxxxxxxxx>
Date: Wed, 20 Mar 2002 15:23:40 -0500

Greetings,

 Here is a patch from cvs 1.12 packet-skinny.c.

 This contains an relativly complete decode for the
skinny messages. I am working on gathering captures
to verify the ones that i have marked not verified.

It is also available at http://x10.erkkila.org/skinny.patch
if there are issues with it.

-pee
Index: packet-skinny.c
===================================================================
RCS file: /cvsroot/ethereal/packet-skinny.c,v
retrieving revision 1.12
diff -u -r1.12 packet-skinny.c
--- packet-skinny.c	2002/03/19 11:26:23	1.12
+++ packet-skinny.c	2002/03/20 20:24:22
@@ -4,7 +4,9 @@
  *   (The "D-Channel"-Protocol for Cisco Systems' IP-Phones)
  * Copyright 2001, Joerg Mayer (email: see AUTHORS file)
  *
- * Further decode work by pee@xxxxxxxxxxx 
+ * Paul E. Erkkila (pee@xxxxxxxxxxx) - fleshed out the decode 
+ * skeleton to report values for most message/message fields. 
+ * Much help from Guy Harris on figuring out the ethereal api.
  *
  * This file is based on packet-aim.c, which is
  * Copyright 2000, Ralf Hoelzer <ralf@xxxxxxxx>
@@ -178,42 +180,42 @@
  * Device type to text conversion table
  */
 static const value_string  deviceTypes[] = {
-  {1  , "DeviceStation30SPplus"},
-  {2  , "DeviceStation12SPplus"},
-  {3  , "DeviceStation12SP"},
-  {4  , "DeviceStation12"},
-  {5  , "DeviceStation30VIP"},
-  {6  , "DeviceStationTelecaster"},
-  {7  , "DeviceStationTelecasterMgr"},
-  {8  , "DeviceStationTelecasterBus"},
-  {20 , "DeviceVirtual30SPplus"},
-  {21 , "DeviceStationPhoneApplication"},
-  {30 , "DeviceAnalogAccess"},
-  {40 , "DeviceDigitalAccessPRI"},
-  {41 , "DeviceDigitalAccessT1"},
-  {42 , "DeviceDigitalAccessTitan2"},
-  {47 , "DeviceAnalogAccessElvis"},
-  {49 , "DeviceDigitalAccessLennon"},
-  {50 , "DeviceConferenceBridge"},
-  {51 , "DeviceConferenceBridgeYoko"},
-  {60 , "DeviceH225"},
-  {61 , "DeviceH323Phone"},
-  {62 , "DeviceH323Trunk"},
-  {70 , "DeviceMusicOnHold"},
-  {71 , "DevicePilot"},
-  {72 , "DeviceTapiPort"},
-  {73 , "DeviceTapiRoutePoint"},
-  {80 , "DeviceVoiceInBox"},
-  {81 , "DeviceVoiceInboxAdmin"},
-  {82 , "DeviceLineAnnunciator"},
-  {90 , "DeviceRouteList"},
-  {100, "DeviceLoadSimulator"},
-  {110, "DeviceMediaTerminationPoint"},
-  {111, "DeviceMediaTerminationPointYoko"},
-  {120, "DeviceMGCPStation"},
-  {121, "DeviceMGCPTrunk"},
-  {122, "DeviceRASProxy"},
-  {255, "DeviceNotDefined"},
+  {1  , "30SPplus"},
+  {2  , "12SPplus"},
+  {3  , "12SP"},
+  {4  , "12"},
+  {5  , "30VIP"},
+  {6  , "Telecaster"},
+  {7  , "TelecasterMgr"},
+  {8  , "TelecasterBus"},
+  {20 , "Virtual30SPplus"},
+  {21 , "PhoneApplication"},
+  {30 , "AnalogAccess"},
+  {40 , "DigitalAccessPRI"},
+  {41 , "DigitalAccessT1"},
+  {42 , "DigitalAccessTitan2"},
+  {47 , "AnalogAccessElvis"},
+  {49 , "DigitalAccessLennon"},
+  {50 , "ConferenceBridge"},
+  {51 , "ConferenceBridgeYoko"},
+  {60 , "H225"},
+  {61 , "H323Phone"},
+  {62 , "H323Trunk"},
+  {70 , "MusicOnHold"},
+  {71 , "Pilot"},
+  {72 , "TapiPort"},
+  {73 , "TapiRoutePoint"},
+  {80 , "VoiceInBox"},
+  {81 , "VoiceInboxAdmin"},
+  {82 , "LineAnnunciator"},
+  {90 , "RouteList"},
+  {100, "LoadSimulator"},
+  {110, "MediaTerminationPoint"},
+  {111, "MediaTerminationPointYoko"},
+  {120, "MGCPStation"},
+  {121, "MGCPTrunk"},
+  {122, "RASProxy"},
+  {255, "NotDefined"},
   { 0    , NULL}
 };
 
@@ -241,32 +243,32 @@
 };
 
 static const value_string deviceStimuli[] = {
-  {1    , "SsLastNumberRedial"},
-  {2    , "SsSpeedDial"},
-  {3    , "SsHold"},
-  {4    , "SsTransfer"},
-  {5    , "SsForwardAll"},
-  {6    , "SsForwardBusy"},
-  {7    , "SsForwardNoAnswer"},
-  {8    , "SsDisplay"},
-  {9    , "SsLine"},
-  {0xa  , "SsT120Chat"},
-  {0xb  , "SsT120Whiteboard"},
-  {0xc  , "SsT120ApplicationSharing"},
-  {0xd  , "SsT120FileTransfer"},
-  {0xe  , "SsVideo"},
-  {0xf  , "SsVoiceMail"},
-  {0x11 , "SsAutoAnswer"},
-  {0x21 , "SsGenericAppB1"},
-  {0x22 , "SsGenericAppB2"},
-  {0x23 , "SsGenericAppB3"},
-  {0x24 , "SsGenericAppB4"},
-  {0x25 , "SsGenericAppB5"},
-  {0x7b , "SsMeetMeConference"},
-  {0x7d , "SsConference=0x7d"},
-  {0x7e , "SsCallPark=0x7e"},
-  {0x7f , "SsCallPickup"},
-  {0x80 , "SsGroupCallPickup=80"},
+  {1    , "LastNumberRedial"},
+  {2    , "SpeedDial"},
+  {3    , "Hold"},
+  {4    , "Transfer"},
+  {5    , "ForwardAll"},
+  {6    , "ForwardBusy"},
+  {7    , "ForwardNoAnswer"},
+  {8    , "Display"},
+  {9    , "Line"},
+  {0xa  , "T120Chat"},
+  {0xb  , "T120Whiteboard"},
+  {0xc  , "T120ApplicationSharing"},
+  {0xd  , "T120FileTransfer"},
+  {0xe  , "Video"},
+  {0xf  , "VoiceMail"},
+  {0x11 , "AutoAnswer"},
+  {0x21 , "GenericAppB1"},
+  {0x22 , "GenericAppB2"},
+  {0x23 , "GenericAppB3"},
+  {0x24 , "GenericAppB4"},
+  {0x25 , "GenericAppB5"},
+  {0x7b , "MeetMeConference"},
+  {0x7d , "Conference=0x7d"},
+  {0x7e , "CallPark=0x7e"},
+  {0x7f , "CallPickup"},
+  {0x80 , "GroupCallPickup=80"},
   {0,NULL}
 };
 
@@ -275,49 +277,49 @@
 #define DeviceMaxCapabilities 18 /* max capabilities allowed in Cap response message */
 
 static const value_string mediaPayloads[] = {
-  {1   , "Media_Payload_NonStandard"},
-  {2   , "Media_Payload_G711Alaw64k"},
-  {3   , "Media_Payload_G711Alaw56k"},
-  {4   , "Media_Payload_G711Ulaw64k"},
-  {5   , "Media_Payload_G711Ulaw56k"},
-  {6   , "Media_Payload_G722_64k"},
-  {7   , "Media_Payload_G722_56k"},
-  {8   , "Media_Payload_G722_48k"},
-  {9   , "Media_Payload_G7231"},
-  {10  , "Media_Payload_G728"},
-  {11  , "Media_Payload_G729"},
-  {12  , "Media_Payload_G729AnnexA"},
-  {13  , "Media_Payload_Is11172AudioCap"},
-  {14  , "Media_Payload_Is13818AudioCap"},
-  {15  , "Media_Payload_G729AnnexB"},
-  {16  , "Media_Payload_G729AnnexAwAnnexB"},
-  {32  , "Media_Payload_Data64"},
-  {33  , "Media_Payload_Data56"},
-  {80  , "Media_Payload_GSM"},
-  {81  , "Media_Payload_ActiveVoice"},
-  {82  , "Media_Payload_G726_32K"},
-  {83  , "Media_Payload_G726_24K"},
-  {84  , "Media_Payload_G726_16K"},
-  {85  , "Media_Payload_G729_B"},
-  {86  , "Media_Payload_G729_B_LOW_COMPLEXITY"},
+  {1   , "NonStandard"},
+  {2   , "G711Alaw64k"},
+  {3   , "G711Alaw56k"},
+  {4   , "G711Ulaw64k"},
+  {5   , "G711Ulaw56k"},
+  {6   , "G722_64k"},
+  {7   , "G722_56k"},
+  {8   , "G722_48k"},
+  {9   , "G7231"},
+  {10  , "G728"},
+  {11  , "G729"},
+  {12  , "G729AnnexA"},
+  {13  , "Is11172AudioCap"},
+  {14  , "Is13818AudioCap"},
+  {15  , "G729AnnexB"},
+  {16  , "G729AnnexAwAnnexB"},
+  {32  , "Data64"},
+  {33  , "Data56"},
+  {80  , "GSM"},
+  {81  , "ActiveVoice"},
+  {82  , "G726_32K"},
+  {83  , "G726_24K"},
+  {84  , "G726_16K"},
+  {85  , "G729_B"},
+  {86  , "G729_B_LOW_COMPLEXITY"},
   {0  , NULL}
 };
 
 static const value_string alarmSeverities[] = {
-  {0   , "severityCritical"},
-  {7   , "severityMajor"},
-  {8   , "severityMinor"},
-  {1   , "severityWarning"},
-  {10  , "severityMarginal"},
-  {4   , "severityUnknown"},
-  {2   , "severityInformational"},
-  {20  , "severityTraceInfo"},
+  {0   , "Critical"},
+  {1   , "Warning"},
+  {2   , "Informational"},
+  {4   , "Unknown"},
+  {7   , "Major"},
+  {8   , "Minor"},
+  {10  , "Marginal"},
+  {20  , "TraceInfo"},
   {0  , NULL}
 };
 
 static const value_string multicastMediaReceptionStatus[] = {
-  {0  , "mmrOk"},
-  {1  , "mmrError"},
+  {0  , "Ok"},
+  {1  , "Error"},
   {0  , NULL}
 };
 
@@ -336,70 +338,70 @@
 
 #define SkMaxSoftKeyCount 18 /* this value should be the same as the max soft key value */
 static const value_string softKeyEvents[] = {
-  {1   , "SkRedial"},
-  {2   , "SkNewCall"},
-  {3   , "SkHold"},
-  {4   , "SkTrnsfer"},
-  {5   , "SkCFwdAll"},
-  {6   , "SkCFwdBusy"},
-  {7   , "SkCFwdNoAnswer"},
-  {8   , "SkBackSpace"},
-  {9   , "SkEndCall"},
-  {10  , "SkResume"},
-  {11  , "SkAnswer"},
-  {12  , "SkInfo"},
-  {13  , "SkConfrn"},
-  {14  , "SkPark"},
-  {15  , "SkJoin"},
-  {16  , "SkMeetMeConfrn"},
-  {17  , "SkCallPickUp"},
-  {18  , "SkGrpCallPickUp"},
+  {1   , "Redial"},
+  {2   , "NewCall"},
+  {3   , "Hold"},
+  {4   , "Trnsfer"},
+  {5   , "CFwdAll"},
+  {6   , "CFwdBusy"},
+  {7   , "CFwdNoAnswer"},
+  {8   , "BackSpace"},
+  {9   , "EndCall"},
+  {10  , "Resume"},
+  {11  , "Answer"},
+  {12  , "Info"},
+  {13  , "Confrn"},
+  {14  , "Park"},
+  {15  , "Join"},
+  {16  , "MeetMeConfrn"},
+  {17  , "CallPickUp"},
+  {18  , "GrpCallPickUp"},
   {0   , NULL}
 };
 
 /* Define info index for each softkey event for Telecaster station. */
 static const value_string softKeyIndexes[] = {
-  {301  , "SkRedialInfoIndex"},
-  {302  , "SkNewCallInfoIndex"},
-  {303  , "SkHoldInfoIndex"},
-  {304  , "SkTrnsferInfoIndex"},
-  {305  , "SkCFwdAllInfoIndex"},
-  {306  , "SkCFwdBusyInfoIndex"},     /* not used yet */
-  {307  , "SkCFwdNoAnswerInfoIndex"}, /* not used yet */
-  {308  , "SkBackSpaceInfoIndex"},
-  {309  , "SkEndCallInfoIndex"},
-  {310  , "SkResumeInfoIndex"},
-  {311  , "SkAnswerInfoIndex"},
-  {312  , "SkInfoInfoIndex"},
-  {313  , "SkConfrnInfoIndex"},
-  {314  , "SkParkInfoIndex"},
-  {315  , "SkJoinInfoIndex"},
-  {316  , "SkMeetMeConfrnInfoIndex"},
-  {317  , "SkCallPickUpInfoIndex"},
-  {318  , "SkGrpCallPickUpInfoIndex"},
+  {301  , "RedialInfoIndex"},
+  {302  , "NewCallInfoIndex"},
+  {303  , "HoldInfoIndex"},
+  {304  , "TrnsferInfoIndex"},
+  {305  , "CFwdAllInfoIndex"},
+  {306  , "CFwdBusyInfoIndex"},     /* not used yet */
+  {307  , "CFwdNoAnswerInfoIndex"}, /* not used yet */
+  {308  , "BackSpaceInfoIndex"},
+  {309  , "EndCallInfoIndex"},
+  {310  , "ResumeInfoIndex"},
+  {311  , "AnswerInfoIndex"},
+  {312  , "InfoInfoIndex"},
+  {313  , "ConfrnInfoIndex"},
+  {314  , "ParkInfoIndex"},
+  {315  , "JoinInfoIndex"},
+  {316  , "MeetMeConfrnInfoIndex"},
+  {317  , "CallPickUpInfoIndex"},
+  {318  , "GrpCallPickUpInfoIndex"},
   {0   , NULL}
 };
 
 
 static const value_string buttonDefinitions[] = {
-  {1    , "BtLastNumberRedial"},
-  {2    , "BtSpeedDial"},
-  {3    , "BtHold"},
-  {4    , "BtTransfer"},
-  {5    , "BtForwardAll"},
-  {6    , "BtForwardBusy"},
-  {7    , "BtForwardNoAnswer"},
-  {8    , "BtDisplay"},
-  {9    , "BtLine"},
-  {0xa  , "BtT120Chat"},
-  {0xb  , "BtT120Whiteboard"},
-  {0xc  , "BtT120ApplicationSharing"},
-  {0xd  , "BtT120FileTransfer"},
-  {0xe  , "BtVideo"},
-  {0x10 , "BtAnswerRelease"},
-  {0xf0 , "BtKeypad"},
-  {0xfd , "BtAEC"},
-  {0xff , "BtUndefined"},
+  {1    , "LastNumberRedial"},
+  {2    , "SpeedDial"},
+  {3    , "Hold"},
+  {4    , "Transfer"},
+  {5    , "ForwardAll"},
+  {6    , "ForwardBusy"},
+  {7    , "ForwardNoAnswer"},
+  {8    , "Display"},
+  {9    , "Line"},
+  {0xa  , "T120Chat"},
+  {0xb  , "T120Whiteboard"},
+  {0xc  , "T120ApplicationSharing"},
+  {0xd  , "T120FileTransfer"},
+  {0xe  , "Video"},
+  {0x10 , "AnswerRelease"},
+  {0xf0 , "Keypad"},
+  {0xfd , "AEC"},
+  {0xff , "Undefined"},
   {0   , NULL}
 };
 
@@ -461,99 +463,199 @@
   {0   , NULL}
 }; 
 
+/* Defined the Call States to be sent to the Telecaste station. 
+ * These are NOT the call states used in CM internally. Instead, 
+ * they are the call states sent from CM and understood by the Telecaster station 
+ */
+static const value_string skinny_stationCallStates[] = {
+  {1   , "OffHook"},
+  {2   , "OnHook"},
+  {3   , "RingOut"},
+  {4   , "RingIn"}, 
+  {5   , "Connected"}, 
+  {6   , "Busy"}, 
+  {7   , "Congestion"}, 
+  {8   , "Hold"}, 
+  {9   , "CallWaiting"}, 
+  {10  , "CallTransfer"}, 
+  {11  , "CallPark"}, 
+  {12  , "Proceed"}, 
+  {13  , "CallRemoteMultiline"}, 
+  {14  , "InvalidNumber"}, 
+  {0   , NULL}
+};
 
-# define NUM_MEDIA_PAYLOADTYPES 19 
-static char *Media_PayloadList[] = { 
-  "Undefined", 
-  "Media_Payload_NonStandard", 
-  "Media_Payload_G711Alaw64k", 
-  "Media_Payload_G711Alaw56k", 
-  "Media_Payload_G711Ulaw64k", 
-  "Media_Payload_G711Ulaw56k", 
-  "Media_Payload_G722_64k", 
-  "Media_Payload_G722_56k", 
-  "Media_Payload_G722_48k", 
-  "Media_Payload_G7231", 
-  "Media_Payload_G728", 
-  "Media_Payload_G729", 
-  "Media_Payload_G729AnnexA", 
-  "Media_Payload_Is11172AudioCap", 
-  "Media_Payload_Is13818AudioCap", 
-  "Media_Payload_G729AnnexB", 
-  "Media_Payload_G729AnnexAwAnnexB", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Media_Payload_Data64", 
-  "Media_Payload_Data56", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Undefined", 
-  "Media_Payload_GSM", 
-  "Media_Payload_ActiveVoice", 
-  "Media_Payload_G726_32K", 
-  "Media_Payload_G726_24K", 
-  "Media_Payload_G726_16K", 
-  "Media_Payload_G729_B", 
-  "Media_Payload_G729_B_LOW_COMPLEXITY", 
-  "Undefined", 
-  "Undefined" 
+/* Defined Call Type */
+static const value_string skinny_callTypes[] = { 
+  {1   , "TsInBoundCall"},
+  {2   , "TsOutBoundCall"}, 
+  {3   , "TsForwardCall"}, 
+  {0   , NULL}
+}; 
+
+/* 
+ * define station-playable tones; 
+ * for tone definitions see SR-TSV-002275, "BOC Notes on the LEC Networks -- 1994" 
+ */
+static const value_string skinny_deviceTones[] = {
+  {0    , "DtSilence"},
+  {1    , "DtDtmf1"},
+  {2    , "DtDtmf2"},
+  {3    , "DtDtmf3"},
+  {4    , "DtDtmf4"},
+  {5    , "DtDtmf5"},
+  {6    , "DtDtmf6"},
+  {7    , "DtDtmf7"},
+  {8    , "DtDtmf8"},
+  {9    , "DtDtmf9"},
+  {0xa  , "DtDtmf0"},
+  {0xe  , "DtDtmfStar"},
+  {0xf  , "DtDtmfPound"},
+  {0x10 , "DtDtmfA"},
+  {0x11 , "DtDtmfB"},
+  {0x12 , "DtDtmfC"},
+  {0x13 , "DtDtmfD"},
+  {0x21 , "DtInsideDialTone"},
+  {0x22 , "DtOutsideDialTone"},
+  {0x23 , "DtLineBusyTone"},
+  {0x24 , "DtAlertingTone"},
+  {0x25 , "DtReorderTone"},
+  {0x26 , "DtRecorderWarningTone"},
+  {0x27 , "DtRecorderDetectedTone"},
+  {0x28 , "DtRevertingTone"},
+  {0x29 , "DtReceiverOffHookTone"},
+  {0x2a , "DtPartialDialTone"},
+  {0x2b , "DtNoSuchNumberTone"},
+  {0x2c , "DtBusyVerificationTone"},
+  {0x2d , "DtCallWaitingTone"},
+  {0x2e , "DtConfirmationTone"},
+  {0x2f , "DtCampOnIndicationTone"},
+  {0x30 , "DtRecallDialTone"},
+  {0x31 , "DtZipZip"},
+  {0x32 , "DtZip"},
+  {0x33 , "DtBeepBonk"},
+  {0x34 , "DtMusicTone"},
+  {0x35 , "DtHoldTone"},
+  {0x36 , "DtTestTone"},
+  {0x40 , "Dt_AddCallWaiting"},
+  {0x41 , "Dt_PriorityCallWait"},
+  {0x42 , "Dt_RecallDial"},
+  {0x43 , "Dt_BargIn"},
+  {0x44 , "Dt_DistinctAlert"},
+  {0x45 , "Dt_PriorityAlert"},
+  {0x46 , "Dt_ReminderRing"},
+  {0x50 , "Dt_MF1"},
+  {0x51 , "Dt_MF2"},
+  {0x52 , "Dt_MF3"},
+  {0x53 , "Dt_MF4"},
+  {0x54 , "Dt_MF5"},
+  {0x55 , "Dt_MF6"},
+  {0x56 , "Dt_MF7"},
+  {0x57 , "Dt_MF8"},
+  {0x58 , "Dt_MF9"},
+  {0x59 , "Dt_MF0"},
+  {0x5a , "Dt_MFKP1"},
+  {0x5b , "Dt_MFST"},
+  {0x5c , "Dt_MFKP2"},
+  {0x5d , "Dt_MFSTP"},
+  {0x5e , "Dt_MFST3P"},
+  {0x5f , "Dt_MILLIWATT"},
+  {0x60 , "Dt_MILLIWATTTEST"},
+  {0x61 , "Dt_HIGHTONE"},
+  {0x62 , "Dt_FLASHOVERRIDE"},
+  {0x63 , "Dt_FLASH"},
+  {0x64 , "Dt_PRIORITY"},
+  {0x65 , "Dt_IMMEDIATE"},
+  {0x66 , "Dt_PREAMPWARN"},
+  {0x67 , "Dt_2105HZ"},
+  {0x68 , "Dt_2600HZ"},
+  {0x69 , "Dt_440HZ"},
+  {0x6a , "Dt_300HZ"},
+  {0x7f , "Dt_NoTone"},
+  {0   , NULL}
+};
+
+/* define ring types */
+static const value_string skinny_ringTypes[] = {
+  {0x1  , "StationRingOff"},
+  {0x2  , "StationInsideRing"},
+  {0x3  , "StationOutsideRing"},
+  {0x4  , "StationFeatureRing"},
+  {0   , NULL}
+};
+
+static const value_string skinny_speakerModes[] = {
+  {1   , "StationSpeakerOn"},
+  {2   , "StationSpeakerOff"},
+  {0   , NULL}
+};
+
+static const value_string skinny_silenceSuppressionModes[] = {
+  {0   , "Media_SilenceSuppression_Off"},
+  {1   , "Media_SilenceSuppression_On"},
+  {0   , NULL}
 }; 
 
+static const value_string skinny_g723BitRates[] = {
+  {1   , "Media_G723BRate_5_3"},
+  {2   , "Media_G723BRate_6_4"},
+  {0   , NULL}
+};
+
+/* define device reset types  */
+static const value_string skinny_deviceResetTypes[] = {
+  {1   , "DEVICE_RESET"},
+  {2   , "DEVICE_RESTART"},
+  {0   , NULL}
+}; 
+
+static const value_string skinny_echoCancelTypes[] = {
+  {0    , "Media_EchoCancellation_Off"},
+  {1    , "Media_EchoCancellation_On"},
+  {0    , NULL}
+}; 
+
+static const value_string skinny_deviceUnregisterStatusTypes[] = {
+  {0   , "UnregisterOk"},
+  {1   , "UnregisterError"},
+  {2   , "UnregisterNAK"}, /* Unregister request is rejected for reaso n such as existence of a call */
+  {0   , NULL}
+};
+
+/* define hook flash detection mode */
+static const value_string skinny_hookFlashDetectModes[] = {
+  {1   , "StationHookFlashOn"},
+  {2   , "StationHookFlashOff"},
+  {0   , NULL}
+}; 
+
+/* define station microphone modes; 
+ * Mic On - The speakerphone's microphone is turned on ONLY if the phone is in the "Speaker On (Off Hook)" 
+ * state (see above). 
+ * Mic Off - The microphone is turned off or, if it's not on, the command is ignored. 
+ */
+static const value_string skinny_microphoneModes[] = {
+  {1   , "StationMicOn"},
+  {2   , "StationMicOff"}, 
+  {0   , NULL}
+};
+
+/* define the session request types */
+static const value_string skinny_sessionTypes[] = {
+  {1   , "Chat"},
+  {2   , "Whiteboard"},
+  {4   , "ApplicationSharing"},
+  {8   , "FileTransfer"},
+  {10  , "Video"},
+  {0   , NULL}
+};
+
+static const value_string skinny_mediaEnunciationTypes[] = {
+  {1  , "None"},
+  {2  , "CallPark"},
+  {0  , NULL}
+}; 
+
 #define StationMaxDirnumSize 24         /* max size of calling or called party dirnum  */
 #define StationMaxNameSize 40           /* max size of calling party's name  */
 #define StationMaxDeviceNameSize 16     /* max size of station's IP name  */
@@ -667,17 +769,50 @@
 static int hf_skinny_dateSeconds = -1;
 static int hf_skinny_dateMilliseconds = -1;
 static int hf_skinny_timeStamp = -1;
+static int hf_skinny_callState = -1;
+static int hf_skinny_deviceTone = -1;
+static int hf_skinny_callingPartyName = -1;
+static int hf_skinny_callingParty = -1;
+static int hf_skinny_calledPartyName = -1;
+static int hf_skinny_callType = -1;
+static int hf_skinny_originalCalledPartyName = -1;
+static int hf_skinny_originalCalledParty = -1;
+static int hf_skinny_ringType = -1;
+static int hf_skinny_speakerMode = -1;
+static int hf_skinny_remoteIpAddr = -1;
+static int hf_skinny_remotePortNumber = -1;
+static int hf_skinny_millisecondPacketSize = -1;
+static int hf_skinny_precedenceValue = -1;
+static int hf_skinny_silenceSuppression = -1;
+static int hf_skinny_g723BitRate = -1;
+static int hf_skinny_conferenceID = -1;
+static int hf_skinny_deviceResetType = -1;
+static int hf_skinny_echoCancelType = -1;
+static int hf_skinny_deviceUnregisterStatus = -1;
+static int hf_skinny_hookFlashDetectMode = -1;
+static int hf_skinny_detectInterval = -1;
+static int hf_skinny_microphoneMode = -1;
+static int hf_skinny_unknown = -1;
+static int hf_skinny_activeForward = -1;
+static int hf_skinny_forwardAllActive = -1;
+static int hf_skinny_forwardBusyActive = -1;
+static int hf_skinny_forwardNoAnswerActive = -1;
+static int hf_skinny_forwardNumber = -1;
+static int hf_skinny_serverName = -1;
+static int hf_skinny_numberLines = -1;
+static int hf_skinny_numberSpeedDials = -1;
+static int hf_skinny_userName = -1;
+static int hf_skinny_sessionType = -1;
+static int hf_skinny_version = -1;
+static int hf_skinny_mediaEnunciationType = -1;
+static int hf_skinny_serverIdentifier = -1;
+static int hf_skinny_serverListenPort = -1;
+static int hf_skinny_serverIpAddress = -1;
+static int hf_skinny_multicastIpAddress = -1;
+static int hf_skinny_multicastPort = -1;
+static int hf_skinny_tokenRejWaitTime = -1;
 
 
-static int hf_skinny_extension   = -1;
-static int hf_skinny_unknown = -1;
-static int hf_skinny_ipDest = -1;
-static int hf_skinny_ipSrc = -1;
-static int hf_skinny_destPort = -1;
-static int hf_skinny_srcPort = -1;
-static int hf_skinny_softKeyNumber = -1;
-static int hf_skinny_line = -1;
-static int hf_skinny_dialedDigit = -1;
 
 /* Initialize the subtree pointers */
 static gint ett_skinny          = -1;
@@ -699,22 +834,9 @@
   guint32 data_messageid;
   gchar   *messageid_str;
   /*  guint32 data_size; */
+
+  guint32 unknownLong = 0;
 
-  guint32 unknown1 = 0;
-  guint32 unknown2 = 0;
-  guint32 unknown3 = 0;
-  guint32 unknown4 = 0;
-  guint32 unknown5 = 0;
-  guint32 unknown6 = 0;
-  guint32 unknown7 = 0;
-  guint32 unknown8 = 0;
-  guint32 unknown9 = 0;
-  guint32 unknown10 = 0;
-
-  int extensionLength = 10;
-  int displayLength   = 100;
-  char extension[extensionLength];
-  char displayMessage[displayLength];
   guint i = 0;
   int j = 0;
 
@@ -796,12 +918,21 @@
     case 0x83 :   /* stopTone */
       break;
 
+    case 0x9a :   /* clearDisplay */
+      break;
+
     case 0x9b :   /* capabilitiesReqMessage */
       break;
 
     case 0x100 :    /* keepAliveAck */
       break;
-	
+
+    case 0x117 :  /* deactivateCallPlane */
+      break;
+
+    case 0x11a :  /* registerTokenAck */
+      break;
+
     /*
      ** cases that need decode
      **
@@ -811,7 +942,7 @@
       proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, StationMaxDeviceNameSize, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, offset+28, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, offset+32, 4, TRUE);
-      proto_tree_add_item(skinny_tree, hf_skinny_ipSrc, tvb, offset+36, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+36, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, offset+40, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_maxStreams, tvb, offset+44, 4, TRUE);
       break;
@@ -857,11 +988,14 @@
       proto_tree_add_uint(skinny_tree, hf_skinny_capCount, tvb, offset+12, 4, capCount);
       for (i = 0; i < capCount; i++) {
 	proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+(i*16)+16, 4, TRUE);
-	proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+(i*16)+20, 4, TRUE);
+	proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+(i*16)+20, 2, TRUE);
 	/* FIXME -- decode the union under here as required, is always 0 on my equipment */
       }
       break;
 
+    case 0x11 : /* mediaPortList */
+      break;
+
     case 0x20 :   /* stationAlarmMessage */
       proto_tree_add_item(skinny_tree, hf_skinny_alarmSeverity, tvb, offset+12, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, 80, TRUE);
@@ -893,26 +1027,35 @@
       proto_tree_add_item(skinny_tree, hf_skinny_jitter, tvb, offset+64, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_latency, tvb, offset+68, 4, TRUE);
       break;
-      
+
+    case 0x24 : /* offHookWithCgpn */
+      proto_tree_add_item(skinny_tree, hf_skinny_calledParty, tvb, offset+12,StationMaxDirnumSize, TRUE); 
+      break;
+
     case 0x26 :  /* softKeyEventMessage */
       proto_tree_add_item(skinny_tree, hf_skinny_softKeyEvent, tvb, offset+12, 4, TRUE);
-      proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
       break;
 
+    case 0x29 : /* registerTokenREq */
+      proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, 4, TRUE);
+      i = offset+12+StationMaxDeviceNameSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i+4, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, i+8, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_deviceType, tvb, i+12, 4, TRUE);
+      break;
+
       /*
        *
        * message not in the spec
        *
        */
     case 0x2b :  /* unknownClientMessage1 */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
-      break;
+    break;
 
     case 0x2d :  /* unknownClientMessage2 */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
       break;
 
       /* 
@@ -927,13 +1070,11 @@
       break;
 
     case 0x82 :  /* startTone */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
+      proto_tree_add_item(skinny_tree, hf_skinny_deviceTone, tvb, offset+12, 4, TRUE);
       break;
 
     case 0x85 : /* setRingerMessage */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
+      proto_tree_add_item(skinny_tree, hf_skinny_ringType, tvb, offset+12, 4, TRUE);
       break;
 	
     case 0x86 : /* setLampMessage */
@@ -942,37 +1083,82 @@
       proto_tree_add_item(skinny_tree, hf_skinny_lampMode, tvb, offset+20, 4, TRUE);
       break;
 
-    case 0x88 : /* setSpeakerModeMessage */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
+    case 0x87 : /* stationHookFlashDetectMode */
+      proto_tree_add_item(skinny_tree, hf_skinny_hookFlashDetectMode, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_detectInterval, tvb, offset+16, 4, TRUE);
       break;
-	
-    case 0x8a :
-      unknown1  = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
-      unknown2  = tvb_get_letohl(tvb, offset+16);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, unknown2);
-      proto_tree_add_item(skinny_tree, hf_skinny_ipDest,   tvb, offset+20, 4, TRUE);
-      proto_tree_add_item(skinny_tree, hf_skinny_destPort,tvb, offset+24, 4, TRUE);
-      unknown5  = tvb_get_letohl(tvb, offset+28);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+28, 4, unknown5);
-      unknown6  = tvb_get_letohl(tvb, offset+32);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+32, 4, unknown6);
-      unknown7  = tvb_get_letohl(tvb, offset+36);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, unknown7);
-      unknown8  = tvb_get_letohl(tvb, offset+40);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+40, 4, unknown8);
-      unknown9  = tvb_get_letohl(tvb, offset+44);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+44, 4, unknown9);
-      unknown10 = tvb_get_letohl(tvb, offset+48);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+48, 4, unknown10);
+
+    case 0x88 : /* setSpeakerMode */
+      
+      proto_tree_add_item(skinny_tree, hf_skinny_speakerMode, tvb, offset+12, 4, TRUE);
+      break;
+
+    case 0x89 : /* setMicroMode */
+      proto_tree_add_item(skinny_tree, hf_skinny_microphoneMode, tvb, offset+12, 4, TRUE);
       break;
 
+    case 0x8a : /* startMediaTransmistion */     
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID,          tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID,       tvb, offset+16, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr,          tvb, offset+20, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_remotePortNumber,      tvb, offset+24, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability,     tvb, offset+32, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue,       tvb, offset+36, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression,    tvb, offset+40, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket,    tvb, offset+44, 2, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate,           tvb, offset+48, 4, TRUE);
+      break;
+
     case 0x8b :  /* stopMediaTransmission */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
-      unknown2 = tvb_get_letohl(tvb, offset+16);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, unknown2);
+     
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);      
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
+      break;
+
+    case 0x8c : /* startMediaReception */
+      break;
+
+    case 0x8d : /* stopMediaReception */
+      break;
+
+    case 0x8e : /* reservered */
+      break;
+
+    case 0x8f : /* callInfo */
+      i = offset+12;
+      proto_tree_add_item(skinny_tree, hf_skinny_callingPartyName, tvb, i, StationMaxNameSize, TRUE);
+      i += StationMaxNameSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_callingParty, tvb, i, StationMaxDirnumSize, TRUE);
+      i += StationMaxDirnumSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_calledPartyName, tvb, i, StationMaxNameSize, TRUE);
+      i += StationMaxNameSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_calledParty, tvb, i, StationMaxDirnumSize, TRUE);
+      i += StationMaxDirnumSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, i, 4, TRUE);
+      i += 4;
+      proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, TRUE);
+      i += 4;
+      proto_tree_add_item(skinny_tree, hf_skinny_callType, tvb, i, 4, TRUE);
+      i += 4;
+      proto_tree_add_item(skinny_tree, hf_skinny_originalCalledPartyName, tvb, i, StationMaxNameSize, TRUE);
+      i += StationMaxNameSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_originalCalledParty, tvb, i, StationMaxDirnumSize, TRUE);
+      break;
+
+    case 0x90 : /* forwardStat */
+      proto_tree_add_item(skinny_tree, hf_skinny_activeForward, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_lineNumber, tvb, offset+16, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_forwardAllActive, tvb, offset+20, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, offset+24, StationMaxDirnumSize, TRUE);
+      i = offset+24+StationMaxDirnumSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_forwardBusyActive, tvb, i, 4, TRUE);
+      i += 4;
+      proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, TRUE);
+      i += StationMaxDirnumSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_forwardNoAnswerActive, tvb, i, 4, TRUE);
+      i += 4;
+      proto_tree_add_item(skinny_tree, hf_skinny_forwardNumber, tvb, i, StationMaxDirnumSize, TRUE);
       break;
 
     case 0x91 : /* speedDialStatMessage */
@@ -987,6 +1173,21 @@
       proto_tree_add_item(skinny_tree, hf_skinny_lineFullyQualifiedDisplayName, tvb, offset+16+StationMaxDirnumSize, StationMaxNameSize, TRUE);
       break;
 
+    case 0x93 : /* configStat */
+      proto_tree_add_item(skinny_tree, hf_skinny_deviceName, tvb, offset+12, 4, TRUE);
+      i = offset+12+StationMaxDeviceNameSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_stationUserId, tvb, i, 4, TRUE);
+      i += 4;
+      proto_tree_add_item(skinny_tree, hf_skinny_stationInstance, tvb, i, 4, TRUE);
+      i += 4;
+      proto_tree_add_item(skinny_tree, hf_skinny_userName, tvb, i, StationMaxNameSize, TRUE);
+      i += StationMaxNameSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_serverName, tvb, i, StationMaxNameSize, TRUE);
+      i += StationMaxNameSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_numberLines, tvb, i, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_numberSpeedDials, tvb, i+4, 4, TRUE);
+      break;
+
     case 0x94 : /* stationDefineTimeDate */
       proto_tree_add_item(skinny_tree, hf_skinny_dateYear,   tvb, offset+12, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_dateMonth,  tvb, offset+16, 4, TRUE);
@@ -998,7 +1199,17 @@
       proto_tree_add_item(skinny_tree, hf_skinny_dateMilliseconds,tvb, offset+40, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_timeStamp, tvb, offset+44, 4, TRUE);
       break;
-      
+
+    case 0x95 : /* startSessionTransmission */
+      proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr,  tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, TRUE);
+      break;
+
+    case 0x96 : /* stopSessionTransmission */
+      proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr,  tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_sessionType, tvb, offset+16, 4, TRUE);
+      break;
+
     case 0x97 :  /* buttonTemplateMessage  */
       /*
        * FIXME
@@ -1015,49 +1226,101 @@
       }
       break;
 
+    case 0x98 : /* version */
+      proto_tree_add_item(skinny_tree, hf_skinny_version, tvb, offset+12, StationMaxVersionSize, TRUE);
+      break;
+
     case 0x99 :  /* displayTextMessage */
-      memset(displayMessage, '\0', displayLength);
-      tvb_memcpy(tvb, displayMessage, offset+12, 32);
-      proto_tree_add_string(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, strlen(displayMessage), displayMessage);        
-      unknown1  = tvb_get_letohl(tvb, offset+44);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+44, 4, unknown1);
+      proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, TRUE);	     
+      break;
+
+    case 0x9c : /* enunciatorCommand */
+      proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, offset+12, 4, TRUE);
+      for (i = 0; i < StationMaxDirnumSize; i++) {
+	proto_tree_add_item(skinny_tree, hf_skinny_unknown, tvb, offset+16+(i*4), 4, TRUE);
+      }
+      i = offset+16+StationMaxDirnumSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_mediaEnunciationType, tvb, i, 4, TRUE);
       break;
 
     case 0x9d : /* stationRegisterReject */
+      proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+12, StationMaxDisplayTextSize, TRUE);
       break;
       
+    case 0x9e : /* serverRes */
+      for (i = 0; i < StationMaxServers; i++) {
+	proto_tree_add_item(skinny_tree, hf_skinny_serverIdentifier, tvb, offset+12+(i*StationMaxServers), StationMaxServers, TRUE);
+      }
+      j = offset+12+(i*StationMaxServers);
+      for (i = 0; i < StationMaxServers; i++) {
+	proto_tree_add_item(skinny_tree, hf_skinny_serverListenPort, tvb, j+(i*4), 4,  TRUE);
+      }
+      j = j+(i*4);
+      for (i = 0; i < StationMaxServers; i++) {
+	proto_tree_add_item(skinny_tree, hf_skinny_serverIpAddress, tvb, j+(i*4), 4, TRUE);
+      }
+      break;
+
     case 0x9f :   /* reset */
-      unknown1  = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
+      proto_tree_add_item(skinny_tree, hf_skinny_deviceResetType, tvb, offset+12, 4, TRUE);
+      break;
+
+    case 0x101 : /* startMulticastMediaReception*/
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType, tvb, offset+36, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+40, 4, TRUE);
       break;
 
+    case 0x102 : /* startMulticateMediaTermination*/
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_multicastIpAddress, tvb, offset+20, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_multicastPort, tvb, offset+24, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize, tvb, offset+28, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability, tvb, offset+32, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_precedenceValue, tvb, offset+36, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+40, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+44, 2, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+48, 4, TRUE);
+      break;
+
+    case 0x103 : /* stopMulticastMediaReception*/
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
+      break;
+
+    case 0x104 : /* stopMulticastMediaTermination*/
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
+      break;
+
     case 0x105 : /* open receive channel */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
-      unknown2 = tvb_get_letohl(tvb, offset+16);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, unknown2);
-      unknown3 = tvb_get_letohl(tvb, offset+20);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+20, 4, unknown3);
-      unknown4 = tvb_get_letohl(tvb, offset+24);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+24, 4, unknown4);
-      unknown5 = tvb_get_letohl(tvb, offset+28);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+28, 4, unknown5);
-      unknown6 = tvb_get_letohl(tvb, offset+32);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+32, 4, unknown6);
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID,            tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID,         tvb, offset+16, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_millisecondPacketSize,   tvb, offset+20, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_payloadCapability,       tvb, offset+24, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_echoCancelType,          tvb, offset+28, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate,             tvb, offset+32, 4, TRUE);
       break;
 
     case 0x106 :  /* closeReceiveChannel */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
-      unknown2 = tvb_get_letohl(tvb, offset+16);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, unknown2);
+      proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, TRUE);
       break;
 
-    case 0x107 :      
-      memset(extension, '\0', extensionLength);
-      tvb_get_nstringz0(tvb, offset+12, extensionLength, extension);
-      proto_tree_add_string(skinny_tree, hf_skinny_extension, tvb, offset+12, strlen(extension), extension);
-      proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+36, 4, TRUE);
+    case 0x107 :  /* connectionStatisticsReq */
+
+      i = 12;
+      proto_tree_add_item(skinny_tree, hf_skinny_directoryNumber, tvb, i, StationMaxDirnumSize, TRUE);
+      i = 12 + StationMaxDirnumSize;
+      proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, i, 4, TRUE);
+      i = i+4;
+      proto_tree_add_item(skinny_tree, hf_skinny_statsProcessingType, tvb, i, 4, TRUE);
       break;
 
     case 0x108 :   /* softkeyTemplateResMessage */
@@ -1115,11 +1378,9 @@
       proto_tree_add_boolean(skm_tree, hf_skinny_softKey15, tvb, offset + 24, 1, validKeyMask);
       break;
       
-    case 0x111 :
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
-      unknown2 = tvb_get_letohl(tvb, offset+16);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+16, 4, unknown2);
+    case 0x111 : /* callState */
+      proto_tree_add_item(skinny_tree, hf_skinny_callState, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+16, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+20, 4, TRUE);
       break;
       
@@ -1130,42 +1391,45 @@
       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+52, 4, TRUE);
       break;
       
-    case 0x113:
+    case 0x113: /* clearPrompt */
+      proto_tree_add_item(skinny_tree, hf_skinny_lineInstance  , tvb, offset+12, 4, TRUE);
       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
       break;
       
-    case 0x114 :
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
-      memset(displayMessage,'\0',displayLength);
-      tvb_memcpy(tvb, displayMessage, offset+16, 16);
-      proto_tree_add_string(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, strlen(displayMessage), displayMessage);
-      unknown2 = tvb_get_letohl(tvb, offset+32);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+32, 4, unknown2);
-      unknown3 = tvb_get_letohl(tvb, offset+36);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, unknown3);
-      unknown4 = tvb_get_letohl(tvb, offset+40);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+40, 4, unknown4);
-      unknown5 = tvb_get_letohl(tvb, offset+44);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+44, 4, unknown5);
+    case 0x114 : /* displayNotify */
+      proto_tree_add_item(skinny_tree, hf_skinny_messageTimeOutValue, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_displayMessage, tvb, offset+16, StationMaxDisplayNotifySize , TRUE);
       break;
       
-    case 0x116 :
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
+    case 0x115 : /* clearNotify */
+      proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, TRUE);
       break;
 
+    case 0x116 : /* activateCallPlane */
+      proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, TRUE);
+      break;
+
     case 0x118 :    /* unregisterAckMessage */
-      unknown1 = tvb_get_letohl(tvb, offset+12);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+12, 4, unknown1);
+      proto_tree_add_item(skinny_tree, hf_skinny_deviceUnregisterStatus, tvb, offset+12, 4, TRUE);
+      break;
+
+    case 0x119 : /* backSpaceReq */
+      proto_tree_add_item(skinny_tree, hf_skinny_lineInstance, tvb, offset+12, 4, TRUE);
+      proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+16, 4, TRUE);
+      break;
+
+    case 0x11B : /* registerTokenReject */
+      proto_tree_add_item(skinny_tree, hf_skinny_tokenRejWaitTime, tvb, offset+12, 4, TRUE);
       break;
 
-    case 0x11D :
-      unknown1       = tvb_get_letohl(tvb, offset+36);
-      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, unknown1);
+    case 0x11D : /* new message */
+      unknownLong       = tvb_get_letohl(tvb, offset+36);
+      proto_tree_add_uint(skinny_tree, hf_skinny_unknown, tvb, offset+36, 4, unknownLong);
       proto_tree_add_item(skinny_tree, hf_skinny_callIdentifier, tvb, offset+40, 4, TRUE);
       break;
       
+
+
     default:
       break;
     }
@@ -1435,7 +1699,7 @@
 
     { &hf_skinny_maxFramesPerPacket,
       { "MaxFramesPerPacket", "skinny.maxFramesPerPacket",
-	FT_UINT32, BASE_DEC, NULL, 0x0,
+	FT_UINT16, BASE_DEC, NULL, 0x0,
 	"Max frames per packet",
 	HFILL }
     },
@@ -1936,84 +2200,294 @@
 	"Time stamp for the call reference",
 	HFILL }
     },
+    { &hf_skinny_callState,
+      { "CallState", "skinny.callState", 
+	FT_UINT32, BASE_DEC, VALS(skinny_stationCallStates), 0x0,
+	"The D channel call state of the call", 
+	HFILL }
+    },
+
+    { &hf_skinny_deviceTone,
+      { "Tone", "skinny.deviceTone", 
+	FT_UINT32, BASE_HEX, VALS(skinny_deviceTones), 0x0,
+	"Which tone to play", 
+	HFILL }
+    },
 
+    { &hf_skinny_callingPartyName,
+      { "Calling Party Name", "skinny.callingPartyName",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"The passed name of the calling party.",
+	HFILL }
+    },
+
+    { &hf_skinny_callingParty,
+      { "Calling Party", "skinny.callingPartyName",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"The passed number of the calling party.",
+	HFILL }
+    },
+
+    { &hf_skinny_calledPartyName,
+      { "Called Party Name", "skinny.calledPartyName",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"The name of the party we are calling.",
+	HFILL }
+    },
+
+    { &hf_skinny_callType,
+      { "Call Type", "skinny.callType", 
+	FT_UINT32, BASE_DEC, VALS(skinny_callTypes), 0x0,
+	"What type of call, in/out/etc", 
+	HFILL }
+    },
 
+    { &hf_skinny_originalCalledPartyName,
+      { "Original Called Party Name", "skinny.originalCalledPartyName",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"name of the original person who placed the call.",
+	HFILL }
+    },
 
+    { &hf_skinny_originalCalledParty,
+      { "Original Called Party", "skinny.originalCalledParty",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"The number of the original calling party.",
+	HFILL }
+    },
 
+    { &hf_skinny_ringType,
+      { "Ring Type", "skinny.ringType", 
+	FT_UINT32, BASE_HEX, VALS(skinny_ringTypes), 0x0,
+	"What type of ring to play", 
+	HFILL }
+    },
 
+    { &hf_skinny_speakerMode,
+      { "Speaker", "skinny.speakerMode", 
+	FT_UINT32, BASE_HEX, VALS(skinny_speakerModes), 0x0,
+	"This message sets the speaker mode on/off", 
+	HFILL }
+    },
 
+    { &hf_skinny_remoteIpAddr,
+      { "Remote Ip Address", "skinny.remoteIpAddr",
+	FT_IPv4, BASE_NONE, NULL, 0x0,
+	"The remote end ip address for this stream",
+	HFILL }
+    },
 
-    /* */
+    { &hf_skinny_remotePortNumber,
+      { "Remote Port", "skinny.remotePortNumber",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"The remote port number listening for this stream",
+	HFILL }
+    },
 
+    { &hf_skinny_millisecondPacketSize,
+      { "MS/Packet", "skinny.millisecondPacketSize",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"The number of milliseconds of conversation in each packet",
+	HFILL }
+    },
 
-    { &hf_skinny_extension,
-      { "Extension", "skinny.extension",
-	FT_STRING, BASE_NONE, NULL, 0x0,
-	"The extension this packets is for.",
+    { &hf_skinny_precedenceValue,
+      { "Precedence", "skinny.precedenceValue",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"Precedence value",
 	HFILL }
     },
 
+    { &hf_skinny_silenceSuppression,
+      { "Silence Suppression", "skinny.silenceSuppression", 
+	FT_UINT32, BASE_HEX, VALS(skinny_silenceSuppressionModes), 0x0,
+	"Mode for silence suppression", 
+	HFILL }
+    },
 
+    { &hf_skinny_g723BitRate,
+      { "G723 BitRate", "skinny.g723BitRate", 
+	FT_UINT32, BASE_DEC, VALS(skinny_g723BitRates), 0x0,
+	"The G723 bit rate for this stream/JUNK if not g723 stream", 
+	HFILL }
+    },
 
+    { &hf_skinny_conferenceID,
+      { "Conference ID", "skinny.conferenceID",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"The conference ID",
+	HFILL }
+    },
 
-    { &hf_skinny_unknown,
-      { "Unknown Long", "skinny.unknown",
-	FT_UINT32, BASE_HEX, NULL, 0x0,
-	"An as yet undecoded long value",
+    { &hf_skinny_deviceResetType,
+      { "Reset Type", "skinny.deviceResetType", 
+	FT_UINT32, BASE_DEC, VALS(skinny_deviceResetTypes), 0x0,
+	"How the devices it to be reset (reset/restart)", 
 	HFILL }
     },
-   
-    { &hf_skinny_ipSrc,
-      { "IP Source", "skinny.ipSrc",
-	FT_IPv4, BASE_NONE, NULL, 0x0,
-	"Ip source address",
+
+    { &hf_skinny_echoCancelType,
+      { "Echo Cancel Type", "skinny.echoCancelType", 
+	FT_UINT32, BASE_DEC, VALS(skinny_echoCancelTypes), 0x0,
+	"Is echo cancelling enabled or not", 
 	HFILL }
     },
 
-    { &hf_skinny_ipDest,
-      { "IP Destination", "skinny.ipDest",
-	FT_IPv4, BASE_NONE, NULL, 0x0,
-	"IP destination address",
+    { &hf_skinny_deviceUnregisterStatus,
+      { "Echo Cancel Type", "skinny.deviceUnregisterStatus", 
+	FT_UINT32, BASE_DEC, VALS(skinny_deviceUnregisterStatusTypes), 0x0,
+	"The status of the device unregister request (*CAN* be refused)", 
+	HFILL }
+    },
+
+    { &hf_skinny_hookFlashDetectMode,
+      { "Hook Flash Mode", "skinny.hookFlashDetectMode", 
+	FT_UINT32, BASE_DEC, VALS(skinny_hookFlashDetectModes), 0x0,
+	"Which method to use to detect that a hook flash has occured", 
+	HFILL }
+    },
+
+    { &hf_skinny_detectInterval,
+      { "HF Detect Interval", "skinny.detectInterval",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"The number of milliseconds that determines a hook flash has occured",
+	HFILL }
+    },
+
+    { &hf_skinny_microphoneMode,
+      { "Microphone Mode", "skinny.microphoneMode", 
+	FT_UINT32, BASE_DEC, VALS(skinny_microphoneModes), 0x0,
+	"Turns on and off the microphone on the set", 
+	HFILL }
+    },
+
+    { &hf_skinny_activeForward,
+      { "Active Forward", "skinny.activeForward",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"This is non zero to indicate that a forward is active on the line",
+	HFILL }
+    },
+
+    { &hf_skinny_forwardAllActive,
+      { "Forward All", "skinny.forwardAllActive",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"Forward all calls",
 	HFILL }
     },
 
+    { &hf_skinny_forwardBusyActive,
+      { "Forward Busy", "skinny.forwardBusyActive",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"Forward calls when busy",
+	HFILL }
+    },
+
+    { &hf_skinny_forwardNoAnswerActive,
+      { "Forward NoAns", "skinny.forwardNoAnswerActive",
+	FT_UINT32, BASE_DEC, NULL, 0x0,
+	"Forward only when no answer",
+	HFILL }
+    },
+
+    { &hf_skinny_forwardNumber,
+      { "Forward Number", "skinny.forwardNumber",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"The number to forward calls to.",
+	HFILL }
+    },
+
+    { &hf_skinny_userName,
+      { "Username", "skinny.userName",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"Username for this device.",
+	HFILL }
+    },
 
+    { &hf_skinny_serverName,
+      { "Server Name", "skinny.serverName",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"The server name for this device.",
+	HFILL }
+    },
 
-    { &hf_skinny_destPort,
-      { "Destination Port", "skinny.destPort",
+    { &hf_skinny_numberLines,
+      { "Number of Lines", "skinny.numberLines",
 	FT_UINT32, BASE_DEC, NULL, 0x0,
-	"Destination Port",
+	"How many lines this device has",
 	HFILL }
     },
 
-    { &hf_skinny_srcPort,
-      { "Source Port", "skinny.srcPort",
+    { &hf_skinny_numberSpeedDials,
+      { "Number of SpeedDials", "skinny.numberSpeedDials",
 	FT_UINT32, BASE_DEC, NULL, 0x0,
-	"Source Port",
+	"The number of speed dials this device has",
+	HFILL }
+    },
+
+    { &hf_skinny_sessionType,
+      { "Session Type", "skinny.sessionType", 
+	FT_UINT32, BASE_DEC, VALS(skinny_sessionTypes), 0x0,
+	"The type of this session.", 
+	HFILL }
+    },
+
+    { &hf_skinny_version,
+      { "Version", "skinny.version",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"Version.",
+	HFILL }
+    },
+
+    { &hf_skinny_mediaEnunciationType,
+      { "Enunciation Type", "skinny.mediaEnunciationType", 
+	FT_UINT32, BASE_DEC, VALS(skinny_mediaEnunciationTypes), 0x0,
+	"No clue.", 
+	HFILL }
+    },
+
+    { &hf_skinny_serverIdentifier,
+      { "Server Identifier", "skinny.serverIdentifier",
+	FT_STRING, BASE_NONE, NULL, 0x0,
+	"Server Identifier.",
 	HFILL }
     },
 
-    { &hf_skinny_softKeyNumber,
-      { "SoftKey", "skinny.softKeyNumber",
+    { &hf_skinny_serverListenPort,
+      { "Server Port", "skinny.serverListenPort", 
 	FT_UINT32, BASE_DEC, NULL, 0x0,
-	"SoftKey",
+	"The port the server listens on.", 
 	HFILL }
     },
 
-    { &hf_skinny_dialedDigit,
-      { "Dialed Digit", "skinny.dialedDigit",
+    { &hf_skinny_serverIpAddress,
+      { "Server Ip Address", "skinny.serverIpAddress",
+	FT_IPv4, BASE_NONE, NULL, 0x0,
+	"The IP address for this server",
+	HFILL }
+    },
+
+    { &hf_skinny_multicastPort,
+      { "Multicast Port", "skinny.multicastPort", 
 	FT_UINT32, BASE_DEC, NULL, 0x0,
-	"Dialed Digit",
+	"The multicast port the to listens on.", 
+	HFILL }
+    },
+
+    { &hf_skinny_multicastIpAddress,
+      { "Multicast Ip Address", "skinny.multicastIpAddress",
+	FT_IPv4, BASE_NONE, NULL, 0x0,
+	"The multicast address for this conference",
 	HFILL }
     },
 
-    { &hf_skinny_line,
-      { "Line", "skinny.line",
+    { &hf_skinny_tokenRejWaitTime,
+      { "Retry Wait Time", "skinny.tokenRejWaitTime", 
 	FT_UINT32, BASE_DEC, NULL, 0x0,
-	"Line",
+	"The time to wait before retrying this token request.", 
 	HFILL }
     },
 
+
   };
   
   /* Setup protocol subtree array */
@@ -2048,3 +2522,105 @@
   skinny_handle = create_dissector_handle(dissect_skinny, proto_skinny);
   dissector_add("tcp.port", TCP_PORT_SKINNY, skinny_handle);
 }
+
+/*
+ * FIXME:
+ *
+ * This is the status of this decode.
+ * Items marked as N/A in the decode field have no params to test
+ * implemented for N/A means they exist in the switch statement
+ * S = stubbed
+ *
+ *  id     message                     implemented  decode tested (via capture)
+ *  ---------------------------------------------------------------------------
+ *  0x0    keepAlive                       Y        N/A 
+ *  0x1    register                        Y        Y
+ *  0x2    ipPort                          Y        Y
+ *  0x3    keypadButton                    Y        Y
+ *  0x4    enblocCall                      Y        N
+ *  0x5    stimulus                        Y        N
+ *  0x6    offHook                         Y        N/A
+ *  0x7    onHook                          Y        N/A
+ *  0x8    hookFlash                       Y        N/A
+ *  0x9    forwardStatReq                  Y        N
+ *  0xa    speedDialStatReq                Y        Y
+ *  0xb    lineStatReq                     Y        Y
+ *  0xc    configStatReq                   Y        N/A
+ *  0xd    timeDateReq                     Y        N/A
+ *  0xe    buttonTemplateReq               Y        N/A
+ *  0xf    versionReq                      Y        N/A
+ *  0x10   capabilitiesRes                 Y        Y -- would like more decodes
+ *  0x11   mediaPortList                   S        N -- no info 
+ *  0x12   serverReq                       Y        N/A
+ *  0x20   alarmMessage                    Y        Y
+ *  0x21   multicastMediaReceptionAck      Y        N
+ *  0x22   openReceiveChannelAck           Y        Y
+ *  0x23   connectionStatisticsRes         Y        Y
+ *  0x24   offHookWithCgpn                 Y        N
+ *  0x25   softKeySetReq                   Y        N/A
+ *  0x26   softKeyEvent                    Y        Y
+ *  0x27   unregister                      Y        N/A
+ *  0x28   softKeytemplateReq              Y        N/A
+ *  0x29   registerTokenReq                Y        N
+ *******************************
+ *  0x2b   unknownClientMessage1           S        N
+ *  0x2d   unknownClientMessage2           S        N
+ *******************************
+ *  0x81   registerAck                     Y        Y
+ *  0x82   startTone                       Y        Y
+ *  0x83   stopTone                        Y        N/A
+ *  0x85   setRinger                       Y        Y
+ *  0x86   setLamp                         Y        Y
+ *  0x87   setHkFDetect                    Y        N
+ *  0x88   setSpeakerMode                  Y        Y
+ *  0x89   setMicroMode                    Y        N
+ *  0x8A   startMediaTransmission          Y        Y
+ *  0x8B   stopMediaTransmission           Y        Y
+ *  0x8C   startMediaReception             S        N
+ *  0x8D   stopMediaReception              S        N
+ *  0x8E   *reserved*                      S        *
+ *  0x8F   callInfo                        Y        Y
+ *  0x90   forwardStat                     Y        N
+ *  0x91   speedDialStat                   Y        Y
+ *  0x92   lineStat                        Y        Y
+ *  0x93   configStat                      Y        N
+ *  0x94   defineTimeDate                  Y        Y
+ *  0x95   startSessionTransmission        Y        N
+ *  0x96   stopSessionTransmission         Y        N
+ *  0x97   buttonTemplate                  Y        Y -- ugly =)
+ *  0x98   version                         Y        N
+ *  0x99   displayText                     Y        Y
+ *  0x9A   clearDisplay                    Y        N/A
+ *  0x9B   capabilitiesReq                 Y        N/A
+ *  0x9C   enunciatorCommand               Y        N (inner loop unknown)
+ *  0x9D   registerReject                  Y        N
+ *  0x9E   serverRes                       Y        N
+ *  0x9F   reset                           Y        Y
+ *  0x100  keepAliveAck                    Y        N/A
+ *  0x101  startMulticastMediaReception    Y        N
+ *  0x102  startMulticastMediaTransmission Y        N
+ *  0x103  stopMulticastMediaReception     Y        N
+ *  0x104  stopMulticastMediaTransmission  Y        N
+ *  0x105  openreceiveChannel              Y        Y
+ *  0x106  closeReceiveChannel             Y        Y
+ *  0x107  connectionStatisticsReq         Y        Y
+ *  0x108  softKeyTemplateRes              Y        Y
+ *  0x109  softKeySetRes                   Y        Y
+ *  0x110  selectSoftKeys                  Y        Y
+ *  0x111  callState                       Y        Y
+ *  0x112  displayPromptStatus             Y        Y
+ *  0x113  clearPromptStatus               Y        Y
+ *  0x114  displayNotify                   Y        Y
+ *  0x115  clearNotify                     Y        Y
+ *  0x116  activateCallPlane               Y        Y
+ *  0x117  deactivateCallPlane             Y        N/A
+ *  0x118  unregisterAck                   Y        Y
+ *  0x119  backSpaceReq                    Y        Y
+ *  0x11A  registerTokenAck                Y        N
+ *  0x11B  registerTokenReject             Y        N
+ *******************************
+ *  0x11D  unknownForwardMessage           NC       N
+ *******************************
+ *
+ *
+ */