From a5be2ad5ac69821c12299716b167dd52041b5342 Mon Sep 17 00:00:00 2001
From: Joel Bender <joel@carrickbender.com>
Date: Wed, 10 May 2023 01:33:01 -0400
Subject: [PATCH] apply patches in #485

---
 py25/bacpypes/__init__.py      |   2 +-
 py25/bacpypes/basetypes.py     | 154 ++++++++---
 py25/bacpypes/object.py        |   8 +-
 py27/bacpypes/__init__.py      |   2 +-
 py27/bacpypes/basetypes.py     | 143 +++++++---
 py27/bacpypes/object.py        |   6 +-
 py34/bacpypes/__init__.py      |   2 +-
 py34/bacpypes/basetypes.py     | 152 ++++++++---
 py34/bacpypes/object.py        |   6 +-
 samples/OpenWeatherServer.py   |   2 +-
 sandbox/network_port_object.py | 474 ++++++++++++++++++++-------------
 setup.py                       |   2 +
 12 files changed, 648 insertions(+), 305 deletions(-)

diff --git a/py25/bacpypes/__init__.py b/py25/bacpypes/__init__.py
index 584efe09..6e27fd0e 100755
--- a/py25/bacpypes/__init__.py
+++ b/py25/bacpypes/__init__.py
@@ -18,7 +18,7 @@
 #   Project Metadata
 #
 
-__version__ = '0.18.5'
+__version__ = '0.18.7'
 __author__ = 'Joel Bender'
 __email__ = 'joel@carrickbender.com'
 
diff --git a/py25/bacpypes/basetypes.py b/py25/bacpypes/basetypes.py
index 945028c2..ea73c9ac 100755
--- a/py25/bacpypes/basetypes.py
+++ b/py25/bacpypes/basetypes.py
@@ -9,7 +9,7 @@
 
 from .primitivedata import Atomic, BitString, Boolean, CharacterString, Date, Double, \
     Enumerated, Integer, Null, ObjectIdentifier, OctetString, Real, Time, \
-    Unsigned, Unsigned16, Tag
+    Unsigned, Unsigned8, Unsigned16, Tag
 from .constructeddata import Any, AnyAtomic, ArrayOf, Choice, Element, \
     Sequence, SequenceOf
 
@@ -95,8 +95,7 @@ class ObjectTypesSupported(BitString):
         , 'accessUser':35
         , 'accessZone':36
         , 'credentialDataInput':37
-        , 'networkPort':56
-        , 'networkSecurity':38
+        , 'networkSecurity':38 # removed revision 22
         , 'bitstringValue':39
         , 'characterstringValue':40
         , 'datePatternValue':41
@@ -113,8 +112,16 @@ class ObjectTypesSupported(BitString):
         , 'alertEnrollment':52
         , 'channel':53
         , 'lightingOutput':54
+        , 'binaryLightingOutput':55
+        , 'networkPort':56
+        , 'elevatorGroup':57
+        , 'escalator':58
+        , 'lift':59
+        , 'staging':60
+        , 'auditLog':61
+        , 'auditReporter':62
         }
-    bitLen = 55
+    bitLen = 63
 
 class ResultFlags(BitString):
     bitNames = \
@@ -167,8 +174,16 @@ class ServicesSupported(BitString):
         , 'subscribeCOVProperty':38
         , 'getEventInformation':39
         , 'writeGroup':40
+        , 'subscribeCOVPropertyMultiple':41
+        , 'confirmedCOVNotificationMultiple':42
+        , 'unconfirmedCOVNotificationMultiple':43
+        , 'confirmedAuditNotification':44
+        , 'auditLogQuery':45
+        , 'unconfirmedAuditNotification':46
+        , 'whoAmI':47
+        , 'youAre':48
         }
-    bitLen = 41
+    bitLen = 49
 
 class StatusFlags(BitString):
     bitNames = \
@@ -758,20 +773,27 @@ class ErrorCode(Enumerated):
         , 'badDestinationDeviceId':87
         , 'badSignature':88
         , 'badSourceAddress':89
-        , 'badTimestamp':90
+        , 'badTimestamp':90 #Removed revision 22
         , 'busy':82
-        , 'cannotUseKey':91
-        , 'cannotVerifyMessageId':92
+        , 'bvlcFunctionUnknown':143
+        , 'bvlcProprietaryFunctionUnknown':144
+        , 'cannotUseKey':91 #Removed revision 22
+        , 'cannotVerifyMessageId':92 #Removed revision 22
         , 'characterSetNotSupported':41
         , 'communicationDisabled':83
         , 'configurationInProgress':2
-        , 'correctKeyRevision':93
+        , 'correctKeyRevision':93 #Removed revision 22
         , 'covSubscriptionFailed':43
         , 'datatypeNotSupported':47
         , 'deleteFdtEntryFailed':120
         , 'deviceBusy':3
-        , 'destinationDeviceIdRequired':94
+        , 'destinationDeviceIdRequired':94 #Removed revision 22
         , 'distributeBroadcastFailed':121
+        , 'dnsError':192
+        , 'dnsNameResolutionFailed':190
+        , 'dnsResolverFailure':191
+        , 'dnsUnavailable':189
+        , 'duplicateEntry': 137
         , 'duplicateMessage':95
         , 'duplicateName':48
         , 'duplicateObjectId':49
@@ -780,28 +802,51 @@ class ErrorCode(Enumerated):
         , 'encryptionRequired':97
         , 'fileAccessDenied':5
         , 'fileFull':128
+        , 'headerEncodingError':145
+        , 'headerNotUnderstood':146
+        , 'httpError':165
+        , 'httpNoUpgrade':153
+        , 'httpNotAServer':164
+        , 'httpResourceNotLocal':154
+        , 'httpProxyAuthenticationFailed':155
+        , 'httpResponseTimeout':156
+        , 'httpResponseSyntaxError':157
+        , 'httpResponseValueError':158
+        , 'httpResponseMissingHeader':159
+        , 'httpTemporaryUnavailable':163
+        , 'httpUnexpectedResponseCode':152
+        , 'httpUpgradeRequired':161
+        , 'httpUpgradeError':162
+        , 'httpWebsocketHeaderError':160
         , 'inconsistentConfiguration':129
         , 'inconsistentObjectType':130
         , 'inconsistentParameters':7
         , 'inconsistentSelectionCriterion':8
-        , 'incorrectKey':98
+        , 'incorrectKey':98 #Removed revision 22
         , 'internalError':131
         , 'invalidArrayIndex':42
         , 'invalidConfigurationData':46
+        , 'invalidDataEncoding':142
         , 'invalidDataType':9
         , 'invalidEventState':73
         , 'invalidFileAccessMethod':10
         , 'invalidFileStartPosition':11
-        , 'invalidKeyData':99
+        , 'invalidKeyData':99 #Removed revision 22
         , 'invalidParameterDataType':13
         , 'invalidTag':57
         , 'invalidTimeStamp':14
-        , 'keyUpdateInProgress':100
+        , 'invalidValueInThisState':138
+        , 'ipAddressNotReachable':198
+        , 'ipError':199
+        , 'keyUpdateInProgress':100 #Removed revision 22
         , 'listElementNotFound':81
+        , 'listItemNotNumbered':140
+        , 'listItemNotTimestamped': 141
         , 'logBufferFull':75
         , 'loggedValuePurged':76
         , 'malformedMessage':101
         , 'messageTooLong':113
+        , 'messageIncomplete':147
         , 'missingRequiredParameter':16
         , 'networkDown':58
         , 'noAlarmConfigured':74
@@ -811,10 +856,12 @@ class ErrorCode(Enumerated):
         , 'noSpaceToAddListElement':19
         , 'noSpaceToWriteProperty':20
         , 'noVtSessionsAvailable':21
+        , 'nodeDuplicateVmac':151
+        , 'notABacnetScHub':148
         , 'notConfigured':132
         , 'notConfiguredForTriggeredLogging':78
         , 'notCovProperty':44
-        , 'notKeyServer':102
+        , 'notKeyServer':102 #Removed revision 22
         , 'notRouterToDnet':110
         , 'objectDeletionNotPermitted':23
         , 'objectIdentifierAlreadyExists':24
@@ -824,6 +871,7 @@ class ErrorCode(Enumerated):
         , 'outOfMemory':133
         , 'parameterOutOfRange':80
         , 'passwordFailure':26
+        , 'payloadExpected':149
         , 'propertyIsNotAList':22
         , 'propertyIsNotAnArray':50
         , 'readAccessDenied':27
@@ -847,19 +895,34 @@ class ErrorCode(Enumerated):
         , 'serviceRequestDenied':29
         , 'sourceSecurityRequired':104
         , 'success':84
+        , 'tcpClosedByLocal':195
+        , 'tcpClosedOther':196
+        , 'tcpConnectTimeout':193
+        , 'tcpConnectionRefused':194
+        , 'tcpError':197
         , 'timeout':30
-        , 'tooManyKeys':105
+        , 'tlsClientAuthenticationFailed':182
+        , 'tlsClientCertificateError':180
+        , 'tlsClientCertificateExpired':184
+        , 'tlsClientCertificateRevoked':186
+        , 'tleError':188
+        , 'tlsServerAuthenticationFailed':183
+        , 'tlsServerCertificateError':181
+        , 'tlsServerCertificateExpired':185
+        , 'tlsServerCertificateRevoked':187
+        , 'tooManyKeys':105 #Removed revision 22
+        , 'unexpectedData':150
         , 'unknownAuthenticationType':106
         , 'unknownDevice':70
         , 'unknownFileSize':122
-        , 'unknownKey':107
-        , 'unknownKeyRevision':108
+        , 'unknownKey':107 #Removed revision 22
+        , 'unknownKeyRevision':108 #Removed revision 22
         , 'unknownNetworkMessage':112
         , 'unknownObject':31
         , 'unknownProperty':32
         , 'unknownSubscription':79
         , 'umknownRoute':71
-        , 'unknownSourceMessage':109
+        , 'unknownSourceMessage':109 #Removed revision 22
         , 'unknownVtClass':34
         , 'unknownVtSession':35
         , 'unsupportedObjectType':36
@@ -868,6 +931,20 @@ class ErrorCode(Enumerated):
         , 'valueTooLong':134
         , 'vtSessionAlreadyClosed':38
         , 'vtSessionTerminationFailure':39
+        , 'websocket-close-error':168
+        , 'websocket-closed-abnormally':173
+        , 'websocket-closed-by-peer':169
+        , 'websocket-data-against-policy':175
+        , 'websocket-data-inconsistent':174
+        , 'websocket-data-not-accepted':172
+        , 'websocket-endpoint-leaves':170
+        , 'websocket-error':179
+        , 'websocket-extension-missing':177
+        , 'websocket-frame-too-long':176
+        , 'websocket-protocol-error':171
+        , 'websocket-request-unavailable':178
+        , 'websocket-scheme-not-supported':166
+        , 'websocket-unknown-control-message':167
         , 'writeAccessDenied':40
         , 'writeBdtFailed':116
         }
@@ -1108,9 +1185,9 @@ class PropertyIdentifier(Enumerated):
     enumerations = \
         { 'absenteeLimit':244
         , 'tags':486
-        , 'profileLocation':91
+        , 'profileLocation':485
         , 'eventDetectionEnabled':353
-        , 'apduLength':388
+        , 'apduLength':399
         , 'linkSpeed':420
         , 'linkSpeeds':421
         , 'linkSpeedAutonegotiate':422
@@ -1140,7 +1217,7 @@ class PropertyIdentifier(Enumerated):
         , 'ipv6DefaultGateway':439
         , 'bacnetIPv6MulticastAddress':440
         , 'ipv6DNSServer':441
-        , 'ipv6AutoAddressingEnabled':442
+        , 'ipv6AutoAddressingEnable':442
         , 'ipv6DHCPLeaseTime':443
         , 'ipv6DHCPLeaseTimeRemaining':444
         , 'ipv6DHCPServer':445
@@ -1364,7 +1441,7 @@ class PropertyIdentifier(Enumerated):
         , 'negativeAccessRules':288
         , 'networkAccessSecurityPolicies':332
         , 'networkNumber':425
-        , 'networkNumberQuality':427
+        , 'networkNumberQuality':426
         , 'networkType': 427
         , 'nodeSubtype':207
         , 'nodeType':208
@@ -1539,6 +1616,7 @@ class Reliability(Enumerated):
         , 'proprietaryCommandFailure': 22
         , 'faultsListed': 23
         , 'referencedObjectFault': 24
+        , 'multiStateOutOfRange':25
         }
 
 class RestartReason(Enumerated):
@@ -1552,6 +1630,7 @@ class RestartReason(Enumerated):
         , 'hardwareWatchdog':5
         , 'softwareWatchdog':6
         , 'suspended':7
+        , 'activateChanges': 8
         }
 
 class SecurityLevel(Enumerated):
@@ -1680,41 +1759,42 @@ class RouterEntryStatus(Enumerated):
 
 class HostAddress(Choice):
     choiceElements = \
-        [ Element('none', Null)
-        , Element('ipAddress', OctetString)  # 4 octets for B/IP or 16 octets for B/IPv6
-        , Element('name', CharacterString)  # Internet host name (see RFC 1123)
+        [ Element('none', Null, 0)
+        , Element('ipAddress', OctetString, 1)  # 4 octets for B/IP or 16 octets for B/IPv6
+        , Element('name', CharacterString, 2)  # Internet host name (see RFC 1123)
         ]
 
 class HostNPort(Sequence):
     sequenceElements = \
-        [ Element('host', HostAddress)
-        , Element('port', Unsigned16)
+        [ Element('host', HostAddress, 0)
+        , Element('port', Unsigned16, 1)
         ]
 
 class BDTEntry(Sequence):
     sequenceElements = \
-        [ Element('bbmdAddress', HostNPort)
-        , Element('broadcastMask', OctetString)  # shall be present if BACnet/IP, and absent for BACnet/IPv6
+        [ Element('bbmdAddress', HostNPort, 0)
+        , Element('broadcastMask', OctetString, 1)  # shall be present if BACnet/IP, and absent for BACnet/IPv6
         ]
 
 class FDTEntry(Sequence):
     sequenceElements = \
-        [ Element('bacnetIPAddress', OctetString)  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
-        , Element('timeToLive', Unsigned16)  # time to live in seconds at the time of registration
-        , Element('remainingTimeToLive', Unsigned16)  # remaining time to live in seconds, incl. grace period
+        [ Element('bacnetIPAddress', OctetString, 0)  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
+        , Element('timeToLive', Unsigned16, 1)  # time to live in seconds at the time of registration
+        , Element('remainingTimeToLive', Unsigned16, 2)  # remaining time to live in seconds, incl. grace period
         ]
 
 class VMACEntry(Sequence):
     sequenceElements = \
-        [ Element('virtualMACAddress', OctetString)  # maximum size 6 octets
-        , Element('nativeMACAddress', OctetString)
+        [ Element('virtualMACAddress', OctetString, 0)  # maximum size 6 octets
+        , Element('nativeMACAddress', OctetString, 1)
         ]
 
 class RouterEntry(Sequence):
     sequenceElements = \
-        [ Element('networkNumber', Unsigned16)
-        , Element('macAddress', OctetString)
-        , Element('status', RouterEntryStatus)  # Defined Above
+        [ Element('networkNumber', Unsigned16, 0)
+        , Element('macAddress', OctetString, 1)
+        , Element('status', RouterEntryStatus, 2)  # Defined Above
+        , Element('performanceIndex', Unsigned8, 3, True)
         ]
 
 class NameValue(Sequence):
diff --git a/py25/bacpypes/object.py b/py25/bacpypes/object.py
index 4368d2be..fb02c38a 100755
--- a/py25/bacpypes/object.py
+++ b/py25/bacpypes/object.py
@@ -1979,11 +1979,11 @@ class NetworkPortObject(Object):
         , ReadableProperty('protocolLevel', ProtocolLevel)  #482
         , OptionalProperty('referencePort', Unsigned)  #483
         , ReadableProperty('networkNumber', Unsigned16)  #425
-        , ReadableProperty('networkNumberQuality', NetworkNumberQuality)  #427
+        , ReadableProperty('networkNumberQuality', NetworkNumberQuality)  #426
         , ReadableProperty('changesPending', Boolean)  #416
         , OptionalProperty('command', NetworkPortCommand)   #417
         , OptionalProperty('macAddress', OctetString)   #423
-        , ReadableProperty('apduLength', Unsigned)  #388
+        , ReadableProperty('apduLength', Unsigned)  #399
         , ReadableProperty('linkSpeed', Real)  #420
         , OptionalProperty('linkSpeeds', ArrayOf(Real))  #421
         , OptionalProperty('eventTimeStamps', ArrayOf(TimeStamp))  #130
@@ -2014,7 +2014,7 @@ class NetworkPortObject(Object):
         , OptionalProperty('ipv6DefaultGateway', OctetString)  #439
         , OptionalProperty('bacnetIPv6MulticastAddress', OctetString)  #440
         , OptionalProperty('ipv6DNSServer', OctetString)  #441
-        , OptionalProperty('ipv6AutoAddressingEnabled', Boolean)  #442
+        , OptionalProperty('ipv6AutoAddressingEnable', Boolean)  #442
         , OptionalProperty('ipv6DHCPLeaseTime', Unsigned)  #443
         , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned)  #444
         , OptionalProperty('ipv6DHCPServer', OctetString)  #445
@@ -2039,7 +2039,7 @@ class NetworkPortObject(Object):
         , ReadableProperty('reliabilityEvaluationInhibit', Boolean) #357
         , OptionalProperty('propertyList', ArrayOf(PropertyIdentifier)) #371
         , OptionalProperty('tags', ArrayOf(NameValue))  #486
-        , OptionalProperty('profileLocation', CharacterString)  #91
+        , OptionalProperty('profileLocation', CharacterString)  #485
         , OptionalProperty('profileName', CharacterString)  #168
         ]
 
diff --git a/py27/bacpypes/__init__.py b/py27/bacpypes/__init__.py
index 584efe09..6e27fd0e 100755
--- a/py27/bacpypes/__init__.py
+++ b/py27/bacpypes/__init__.py
@@ -18,7 +18,7 @@
 #   Project Metadata
 #
 
-__version__ = '0.18.5'
+__version__ = '0.18.7'
 __author__ = 'Joel Bender'
 __email__ = 'joel@carrickbender.com'
 
diff --git a/py27/bacpypes/basetypes.py b/py27/bacpypes/basetypes.py
index e62a2958..9c266707 100755
--- a/py27/bacpypes/basetypes.py
+++ b/py27/bacpypes/basetypes.py
@@ -117,8 +117,7 @@ class ObjectTypesSupported(BitString):
         , 'accessUser':35
         , 'accessZone':36
         , 'credentialDataInput':37
-        , 'networkPort':56
-        , 'networkSecurity':38
+        , 'networkSecurity':38 # removed revision 22
         , 'bitstringValue':39
         , 'characterstringValue':40
         , 'datePatternValue':41
@@ -135,8 +134,16 @@ class ObjectTypesSupported(BitString):
         , 'alertEnrollment':52
         , 'channel':53
         , 'lightingOutput':54
+        , 'binaryLightingOutput':55
+        , 'networkPort':56
+        , 'elevatorGroup':57
+        , 'escalator':58
+        , 'lift':59
+        , 'staging':60
+        , 'auditLog':61
+        , 'auditReporter':62
         }
-    bitLen = 55
+    bitLen = 63
 
 class PriorityFilter(BitString):
     bitNames = \
@@ -210,8 +217,16 @@ class ServicesSupported(BitString):
         , 'subscribeCOVProperty':38
         , 'getEventInformation':39
         , 'writeGroup':40
+        , 'subscribeCOVPropertyMultiple':41
+        , 'confirmedCOVNotificationMultiple':42
+        , 'unconfirmedCOVNotificationMultiple':43
+        , 'confirmedAuditNotification':44
+        , 'auditLogQuery':45
+        , 'unconfirmedAuditNotification':46
+        , 'whoAmI':47
+        , 'youAre':48
         }
-    bitLen = 41
+    bitLen = 49
 
 class StatusFlags(BitString):
     bitNames = \
@@ -842,20 +857,26 @@ class ErrorCode(Enumerated):
         , 'badDestinationDeviceId':87
         , 'badSignature':88
         , 'badSourceAddress':89
-        , 'badTimestamp':90
+        , 'badTimestamp':90 #Removed revision 22
         , 'busy':82
-        , 'cannotUseKey':91
-        , 'cannotVerifyMessageId':92
+        , 'bvlcFunctionUnknown':143
+        , 'bvlcProprietaryFunctionUnknown':144
+        , 'cannotUseKey':91 #Removed revision 22
+        , 'cannotVerifyMessageId':92 #Removed revision 22
         , 'characterSetNotSupported':41
         , 'communicationDisabled':83
         , 'configurationInProgress':2
-        , 'correctKeyRevision':93
+        , 'correctKeyRevision':93 #Removed revision 22
         , 'covSubscriptionFailed':43
         , 'datatypeNotSupported':47
         , 'deleteFdtEntryFailed':120
         , 'deviceBusy':3
-        , 'destinationDeviceIdRequired':94
+        , 'destinationDeviceIdRequired':94 #Removed revision 22
         , 'distributeBroadcastFailed':121
+        , 'dnsNameResolutionFailed':190
+        , 'dnsResolverFailure':191
+        , 'dnsUnavailable':189
+        , 'duplicateEntry': 137
         , 'duplicateMessage':95
         , 'duplicateName':48
         , 'duplicateObjectId':49
@@ -864,14 +885,31 @@ class ErrorCode(Enumerated):
         , 'encryptionRequired':97
         , 'fileAccessDenied':5
         , 'fileFull':128
+        , 'headerEncodingError':145
+        , 'headerNotUnderstood':146
+        , 'httpError':165
+        , 'httpNoUpgrade':153
+        , 'httpNotAServer':164
+        , 'httpResourceNotLocal':154
+        , 'httpProxyAuthenticationFailed':155
+        , 'httpResponseTimeout':156
+        , 'httpResponseSyntaxError':157
+        , 'httpResponseValueError':158
+        , 'httpResponseMissingHeader':159
+        , 'httpTemporaryUnavailable':163
+        , 'httpUnexpectedResponseCode':152
+        , 'httpUpgradeRequired':161
+        , 'httpUpgradeError':162
+        , 'httpWebsocketHeaderError':160
         , 'inconsistentConfiguration':129
         , 'inconsistentObjectType':130
         , 'inconsistentParameters':7
         , 'inconsistentSelectionCriterion':8
-        , 'incorrectKey':98
+        , 'incorrectKey':98 #Removed revision 22
         , 'internalError':131
         , 'invalidArrayIndex':42
         , 'invalidConfigurationData':46
+        , 'invalidDataEncoding':142
         , 'invalidDataType':9
         , 'invalidEventState':73
         , 'invalidFileAccessMethod':10
@@ -880,12 +918,18 @@ class ErrorCode(Enumerated):
         , 'invalidParameterDataType':13
         , 'invalidTag':57
         , 'invalidTimeStamp':14
-        , 'keyUpdateInProgress':100
+        , 'invalidValueInThisState':138
+        , 'ipAddressNotReachable':198
+        , 'ipError':199
+        , 'keyUpdateInProgress':100 #Removed revision 22
         , 'listElementNotFound':81
+        , 'listItemNotNumbered':140
+        , 'listItemNotTimestamped': 141
         , 'logBufferFull':75
         , 'loggedValuePurged':76
         , 'malformedMessage':101
         , 'messageTooLong':113
+        , 'messageIncomplete':147
         , 'missingRequiredParameter':16
         , 'networkDown':58
         , 'noAlarmConfigured':74
@@ -895,10 +939,12 @@ class ErrorCode(Enumerated):
         , 'noSpaceToAddListElement':19
         , 'noSpaceToWriteProperty':20
         , 'noVtSessionsAvailable':21
+        , 'nodeDuplicateVmac':151
+        , 'notABacnetScHub':148
         , 'notConfigured':132
         , 'notConfiguredForTriggeredLogging':78
         , 'notCovProperty':44
-        , 'notKeyServer':102
+        , 'notKeyServer':102 #Removed revision 22
         , 'notRouterToDnet':110
         , 'objectDeletionNotPermitted':23
         , 'objectIdentifierAlreadyExists':24
@@ -908,6 +954,7 @@ class ErrorCode(Enumerated):
         , 'outOfMemory':133
         , 'parameterOutOfRange':80
         , 'passwordFailure':26
+        , 'payloadExpected':149
         , 'propertyIsNotAList':22
         , 'propertyIsNotAnArray':50
         , 'readAccessDenied':27
@@ -931,19 +978,34 @@ class ErrorCode(Enumerated):
         , 'serviceRequestDenied':29
         , 'sourceSecurityRequired':104
         , 'success':84
+        , 'tcpClosedByLocal':195
+        , 'tcpClosedOther':196
+        , 'tcpConnectTimeout':193
+        , 'tcpConnectionRefused':194
+        , 'tcpError':197
         , 'timeout':30
-        , 'tooManyKeys':105
+        , 'tlsClientAuthenticationFailed':182
+        , 'tlsClientCertificateError':180
+        , 'tlsClientCertificateExpired':184
+        , 'tlsClientCertificateRevoked':186
+        , 'tleError':188
+        , 'tlsServerAuthenticationFailed':183
+        , 'tlsServerCertificateError':181
+        , 'tlsServerCertificateExpired':185
+        , 'tlsServerCertificateRevoked':187
+        , 'tooManyKeys':105 #Removed revision 22
+        , 'unexpectedData':150
         , 'unknownAuthenticationType':106
         , 'unknownDevice':70
         , 'unknownFileSize':122
-        , 'unknownKey':107
-        , 'unknownKeyRevision':108
+        , 'unknownKey':107 #Removed revision 22
+        , 'unknownKeyRevision':108 #Removed revision 22
         , 'unknownNetworkMessage':112
         , 'unknownObject':31
         , 'unknownProperty':32
         , 'unknownSubscription':79
         , 'umknownRoute':71
-        , 'unknownSourceMessage':109
+        , 'unknownSourceMessage':109 #Removed revision 22
         , 'unknownVtClass':34
         , 'unknownVtSession':35
         , 'unsupportedObjectType':36
@@ -952,6 +1014,20 @@ class ErrorCode(Enumerated):
         , 'valueTooLong':134
         , 'vtSessionAlreadyClosed':38
         , 'vtSessionTerminationFailure':39
+        , 'websocket-close-error':168
+        , 'websocket-closed-abnormally':173
+        , 'websocket-closed-by-peer':169
+        , 'websocket-data-against-policy':175
+        , 'websocket-data-inconsistent':174
+        , 'websocket-data-not-accepted':172
+        , 'websocket-endpoint-leaves':170
+        , 'websocket-error':179
+        , 'websocket-extension-missing':177
+        , 'websocket-frame-too-long':176
+        , 'websocket-protocol-error':171
+        , 'websocket-request-unavailable':178
+        , 'websocket-scheme-not-supported':166
+        , 'websocket-unknown-control-message':167
         , 'writeAccessDenied':40
         , 'writeBdtFailed':116
         }
@@ -1326,7 +1402,7 @@ class PropertyIdentifier(Enumerated):
         , 'all':8
         , 'allowGroupDelayInhibit':365
         , 'allWritesSuccessful':9
-        , 'apduLength':388
+        , 'apduLength':399
         , 'apduSegmentTimeout':10
         , 'apduTimeout':11
         , 'applicationSoftwareVersion':12
@@ -1509,7 +1585,7 @@ class PropertyIdentifier(Enumerated):
         , 'ipDNSServer':406
         , 'ipSubnetMask':411
         , 'ipv6Address':436
-        , 'ipv6AutoAddressingEnabled':442
+        , 'ipv6AutoAddressingEnable':442
         , 'ipv6DefaultGateway':439
         , 'ipv6DHCPLeaseTime':443
         , 'ipv6DHCPLeaseTimeRemaining':444
@@ -1602,7 +1678,7 @@ class PropertyIdentifier(Enumerated):
         , 'networkAccessSecurityPolicies':332
         , 'networkInterfaceName':424
         , 'networkNumber':425
-        , 'networkNumberQuality':427
+        , 'networkNumberQuality':426
         , 'networkType': 427
         , 'nextStoppingFloor':476
         , 'nodeSubtype':207
@@ -1650,7 +1726,7 @@ class PropertyIdentifier(Enumerated):
         , 'priorityForWriting':88
         , 'processIdentifier':89
         , 'processIdentifierFilter':361
-        , 'profileLocation':91
+        , 'profileLocation':485
         , 'profileName':168
         , 'programChange':90
         , 'programLocation':91
@@ -1837,6 +1913,7 @@ class Reliability(Enumerated):
         , 'proprietaryCommandFailure': 22
         , 'faultsListed': 23
         , 'referencedObjectFault': 24
+        , 'multiStateOutOfRange':25
         }
 
 class RestartReason(Enumerated):
@@ -1850,6 +1927,7 @@ class RestartReason(Enumerated):
         , 'hardwareWatchdog':5
         , 'softwareWatchdog':6
         , 'suspended':7
+        , 'activateChanges': 8
         }
 
 class SecurityLevel(Enumerated):
@@ -1997,34 +2075,35 @@ class RouterEntryStatus(Enumerated):
 
 class HostAddress(Choice):
     choiceElements = \
-        [ Element('none', Null)
-        , Element('ipAddress', OctetString)  # 4 octets for B/IP or 16 octets for B/IPv6
-        , Element('name', CharacterString)  # Internet host name (see RFC 1123)
+        [ Element('none', Null, 0)
+        , Element('ipAddress', OctetString, 1)  # 4 octets for B/IP or 16 octets for B/IPv6
+        , Element('name', CharacterString, 2)  # Internet host name (see RFC 1123)
         ]
 
 class HostNPort(Sequence):
     sequenceElements = \
-        [ Element('host', HostAddress)
-        , Element('port', Unsigned16)
+        [ Element('host', HostAddress, 0)
+        , Element('port', Unsigned16, 1)
         ]
 
 class BDTEntry(Sequence):
     sequenceElements = \
-        [ Element('bbmdAddress', HostNPort)
-        , Element('broadcastMask', OctetString)  # shall be present if BACnet/IP, and absent for BACnet/IPv6
+        [ Element('bbmdAddress', HostNPort, 0)
+        , Element('broadcastMask', OctetString, 1)  # shall be present if BACnet/IP, and absent for BACnet/IPv6
         ]
 
 class FDTEntry(Sequence):
     sequenceElements = \
-        [ Element('bacnetIPAddress', OctetString)  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
-        , Element('timeToLive', Unsigned16)  # time to live in seconds at the time of registration
-        , Element('remainingTimeToLive', Unsigned16)  # remaining time to live in seconds, incl. grace period
+        [ Element('bacnetIPAddress', OctetString, 0)  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
+        , Element('timeToLive', Unsigned16, 1)  # time to live in seconds at the time of registration
+        , Element('remainingTimeToLive', Unsigned16, 2)  # remaining time to live in seconds, incl. grace period
+        , Element('performanceIndex', Unsigned8, 3, True)
         ]
 
 class VMACEntry(Sequence):
     sequenceElements = \
-        [ Element('virtualMACAddress', OctetString)  # maximum size 6 octets
-        , Element('nativeMACAddress', OctetString)
+        [ Element('virtualMACAddress', OctetString, 0)  # maximum size 6 octets
+        , Element('nativeMACAddress', OctetString, 1)
         ]
 
 class PropertyReference(Sequence):
diff --git a/py27/bacpypes/object.py b/py27/bacpypes/object.py
index 82ffd281..c1aab9f2 100755
--- a/py27/bacpypes/object.py
+++ b/py27/bacpypes/object.py
@@ -2340,11 +2340,11 @@ class NetworkPortObject(Object):
         , ReadableProperty('protocolLevel', ProtocolLevel)  #482
         , OptionalProperty('referencePort', Unsigned)  #483
         , ReadableProperty('networkNumber', Unsigned16)  #425
-        , ReadableProperty('networkNumberQuality', NetworkNumberQuality)  #427
+        , ReadableProperty('networkNumberQuality', NetworkNumberQuality)  #426
         , ReadableProperty('changesPending', Boolean)  #416
         , OptionalProperty('command', NetworkPortCommand)   #417
         , OptionalProperty('macAddress', OctetString)   #423
-        , ReadableProperty('apduLength', Unsigned)  #388
+        , ReadableProperty('apduLength', Unsigned)  #399
         , ReadableProperty('linkSpeed', Real)  #420
         , OptionalProperty('linkSpeeds', ArrayOf(Real))  #421
         , OptionalProperty('linkSpeedAutonegotiate', Boolean)  #422
@@ -2374,7 +2374,7 @@ class NetworkPortObject(Object):
         , OptionalProperty('ipv6DefaultGateway', OctetString)  #439
         , OptionalProperty('bacnetIPv6MulticastAddress', OctetString)  #440
         , OptionalProperty('ipv6DNSServer', OctetString)  #441
-        , OptionalProperty('ipv6AutoAddressingEnabled', Boolean)  #442
+        , OptionalProperty('ipv6AutoAddressingEnable', Boolean)  #442
         , OptionalProperty('ipv6DHCPLeaseTime', Unsigned)  #443
         , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned)  #444
         , OptionalProperty('ipv6DHCPServer', OctetString)  #445
diff --git a/py34/bacpypes/__init__.py b/py34/bacpypes/__init__.py
index 49cd7867..3a06c8ef 100755
--- a/py34/bacpypes/__init__.py
+++ b/py34/bacpypes/__init__.py
@@ -18,7 +18,7 @@
 #   Project Metadata
 #
 
-__version__ = '0.18.6'
+__version__ = '0.18.7'
 __author__ = 'Joel Bender'
 __email__ = 'joel@carrickbender.com'
 
diff --git a/py34/bacpypes/basetypes.py b/py34/bacpypes/basetypes.py
index e62a2958..b8334036 100755
--- a/py34/bacpypes/basetypes.py
+++ b/py34/bacpypes/basetypes.py
@@ -117,8 +117,7 @@ class ObjectTypesSupported(BitString):
         , 'accessUser':35
         , 'accessZone':36
         , 'credentialDataInput':37
-        , 'networkPort':56
-        , 'networkSecurity':38
+        , 'networkSecurity':38 # removed revision 22
         , 'bitstringValue':39
         , 'characterstringValue':40
         , 'datePatternValue':41
@@ -135,8 +134,16 @@ class ObjectTypesSupported(BitString):
         , 'alertEnrollment':52
         , 'channel':53
         , 'lightingOutput':54
+        , 'binaryLightingOutput':55
+        , 'networkPort':56
+        , 'elevatorGroup':57
+        , 'escalator':58
+        , 'lift':59
+        , 'staging':60
+        , 'auditLog':61
+        , 'auditReporter':62
         }
-    bitLen = 55
+    bitLen = 63
 
 class PriorityFilter(BitString):
     bitNames = \
@@ -210,8 +217,16 @@ class ServicesSupported(BitString):
         , 'subscribeCOVProperty':38
         , 'getEventInformation':39
         , 'writeGroup':40
+        , 'subscribeCOVPropertyMultiple':41
+        , 'confirmedCOVNotificationMultiple':42
+        , 'unconfirmedCOVNotificationMultiple':43
+        , 'confirmedAuditNotification':44
+        , 'auditLogQuery':45
+        , 'unconfirmedAuditNotification':46
+        , 'whoAmI':47
+        , 'youAre':48
         }
-    bitLen = 41
+    bitLen = 49
 
 class StatusFlags(BitString):
     bitNames = \
@@ -842,20 +857,27 @@ class ErrorCode(Enumerated):
         , 'badDestinationDeviceId':87
         , 'badSignature':88
         , 'badSourceAddress':89
-        , 'badTimestamp':90
+        , 'badTimestamp':90 #Removed revision 22
         , 'busy':82
-        , 'cannotUseKey':91
-        , 'cannotVerifyMessageId':92
+        , 'bvlcFunctionUnknown':143
+        , 'bvlcProprietaryFunctionUnknown':144
+        , 'cannotUseKey':91 #Removed revision 22
+        , 'cannotVerifyMessageId':92 #Removed revision 22
         , 'characterSetNotSupported':41
         , 'communicationDisabled':83
         , 'configurationInProgress':2
-        , 'correctKeyRevision':93
+        , 'correctKeyRevision':93 #Removed revision 22
         , 'covSubscriptionFailed':43
         , 'datatypeNotSupported':47
         , 'deleteFdtEntryFailed':120
         , 'deviceBusy':3
-        , 'destinationDeviceIdRequired':94
+        , 'destinationDeviceIdRequired':94 #Removed revision 22
         , 'distributeBroadcastFailed':121
+        , 'dnsError':192
+        , 'dnsNameResolutionFailed':190
+        , 'dnsResolverFailure':191
+        , 'dnsUnavailable':189
+        , 'duplicateEntry': 137
         , 'duplicateMessage':95
         , 'duplicateName':48
         , 'duplicateObjectId':49
@@ -864,28 +886,51 @@ class ErrorCode(Enumerated):
         , 'encryptionRequired':97
         , 'fileAccessDenied':5
         , 'fileFull':128
+        , 'headerEncodingError':145
+        , 'headerNotUnderstood':146
+        , 'httpError':165
+        , 'httpNoUpgrade':153
+        , 'httpNotAServer':164
+        , 'httpResourceNotLocal':154
+        , 'httpProxyAuthenticationFailed':155
+        , 'httpResponseTimeout':156
+        , 'httpResponseSyntaxError':157
+        , 'httpResponseValueError':158
+        , 'httpResponseMissingHeader':159
+        , 'httpTemporaryUnavailable':163
+        , 'httpUnexpectedResponseCode':152
+        , 'httpUpgradeRequired':161
+        , 'httpUpgradeError':162
+        , 'httpWebsocketHeaderError':160
         , 'inconsistentConfiguration':129
         , 'inconsistentObjectType':130
         , 'inconsistentParameters':7
         , 'inconsistentSelectionCriterion':8
-        , 'incorrectKey':98
+        , 'incorrectKey':98 #Removed revision 22
         , 'internalError':131
         , 'invalidArrayIndex':42
         , 'invalidConfigurationData':46
+        , 'invalidDataEncoding':142
         , 'invalidDataType':9
         , 'invalidEventState':73
         , 'invalidFileAccessMethod':10
         , 'invalidFileStartPosition':11
-        , 'invalidKeyData':99
+        , 'invalidKeyData':99 #Removed revision 22
         , 'invalidParameterDataType':13
         , 'invalidTag':57
         , 'invalidTimeStamp':14
-        , 'keyUpdateInProgress':100
+        , 'invalidValueInThisState':138
+        , 'ipAddressNotReachable':198
+        , 'ipError':199
+        , 'keyUpdateInProgress':100 #Removed revision 22
         , 'listElementNotFound':81
+        , 'listItemNotNumbered':140
+        , 'listItemNotTimestamped': 141
         , 'logBufferFull':75
         , 'loggedValuePurged':76
         , 'malformedMessage':101
         , 'messageTooLong':113
+        , 'messageIncomplete':147
         , 'missingRequiredParameter':16
         , 'networkDown':58
         , 'noAlarmConfigured':74
@@ -895,10 +940,12 @@ class ErrorCode(Enumerated):
         , 'noSpaceToAddListElement':19
         , 'noSpaceToWriteProperty':20
         , 'noVtSessionsAvailable':21
+        , 'nodeDuplicateVmac':151
+        , 'notABacnetScHub':148
         , 'notConfigured':132
         , 'notConfiguredForTriggeredLogging':78
         , 'notCovProperty':44
-        , 'notKeyServer':102
+        , 'notKeyServer':102 #Removed revision 22
         , 'notRouterToDnet':110
         , 'objectDeletionNotPermitted':23
         , 'objectIdentifierAlreadyExists':24
@@ -908,6 +955,7 @@ class ErrorCode(Enumerated):
         , 'outOfMemory':133
         , 'parameterOutOfRange':80
         , 'passwordFailure':26
+        , 'payloadExpected':149
         , 'propertyIsNotAList':22
         , 'propertyIsNotAnArray':50
         , 'readAccessDenied':27
@@ -931,19 +979,34 @@ class ErrorCode(Enumerated):
         , 'serviceRequestDenied':29
         , 'sourceSecurityRequired':104
         , 'success':84
+        , 'tcpClosedByLocal':195
+        , 'tcpClosedOther':196
+        , 'tcpConnectTimeout':193
+        , 'tcpConnectionRefused':194
+        , 'tcpError':197
         , 'timeout':30
-        , 'tooManyKeys':105
+        , 'tlsClientAuthenticationFailed':182
+        , 'tlsClientCertificateError':180
+        , 'tlsClientCertificateExpired':184
+        , 'tlsClientCertificateRevoked':186
+        , 'tleError':188
+        , 'tlsServerAuthenticationFailed':183
+        , 'tlsServerCertificateError':181
+        , 'tlsServerCertificateExpired':185
+        , 'tlsServerCertificateRevoked':187
+        , 'tooManyKeys':105 #Removed revision 22
+        , 'unexpectedData':150
         , 'unknownAuthenticationType':106
         , 'unknownDevice':70
         , 'unknownFileSize':122
-        , 'unknownKey':107
-        , 'unknownKeyRevision':108
+        , 'unknownKey':107 #Removed revision 22
+        , 'unknownKeyRevision':108 #Removed revision 22
         , 'unknownNetworkMessage':112
         , 'unknownObject':31
         , 'unknownProperty':32
         , 'unknownSubscription':79
         , 'umknownRoute':71
-        , 'unknownSourceMessage':109
+        , 'unknownSourceMessage':109 #Removed revision 22
         , 'unknownVtClass':34
         , 'unknownVtSession':35
         , 'unsupportedObjectType':36
@@ -952,6 +1015,20 @@ class ErrorCode(Enumerated):
         , 'valueTooLong':134
         , 'vtSessionAlreadyClosed':38
         , 'vtSessionTerminationFailure':39
+        , 'websocket-close-error':168
+        , 'websocket-closed-abnormally':173
+        , 'websocket-closed-by-peer':169
+        , 'websocket-data-against-policy':175
+        , 'websocket-data-inconsistent':174
+        , 'websocket-data-not-accepted':172
+        , 'websocket-endpoint-leaves':170
+        , 'websocket-error':179
+        , 'websocket-extension-missing':177
+        , 'websocket-frame-too-long':176
+        , 'websocket-protocol-error':171
+        , 'websocket-request-unavailable':178
+        , 'websocket-scheme-not-supported':166
+        , 'websocket-unknown-control-message':167
         , 'writeAccessDenied':40
         , 'writeBdtFailed':116
         }
@@ -1326,7 +1403,7 @@ class PropertyIdentifier(Enumerated):
         , 'all':8
         , 'allowGroupDelayInhibit':365
         , 'allWritesSuccessful':9
-        , 'apduLength':388
+        , 'apduLength':399
         , 'apduSegmentTimeout':10
         , 'apduTimeout':11
         , 'applicationSoftwareVersion':12
@@ -1509,7 +1586,7 @@ class PropertyIdentifier(Enumerated):
         , 'ipDNSServer':406
         , 'ipSubnetMask':411
         , 'ipv6Address':436
-        , 'ipv6AutoAddressingEnabled':442
+        , 'ipv6AutoAddressingEnable':442
         , 'ipv6DefaultGateway':439
         , 'ipv6DHCPLeaseTime':443
         , 'ipv6DHCPLeaseTimeRemaining':444
@@ -1602,7 +1679,7 @@ class PropertyIdentifier(Enumerated):
         , 'networkAccessSecurityPolicies':332
         , 'networkInterfaceName':424
         , 'networkNumber':425
-        , 'networkNumberQuality':427
+        , 'networkNumberQuality':426
         , 'networkType': 427
         , 'nextStoppingFloor':476
         , 'nodeSubtype':207
@@ -1650,7 +1727,7 @@ class PropertyIdentifier(Enumerated):
         , 'priorityForWriting':88
         , 'processIdentifier':89
         , 'processIdentifierFilter':361
-        , 'profileLocation':91
+        , 'profileLocation':485
         , 'profileName':168
         , 'programChange':90
         , 'programLocation':91
@@ -1837,6 +1914,7 @@ class Reliability(Enumerated):
         , 'proprietaryCommandFailure': 22
         , 'faultsListed': 23
         , 'referencedObjectFault': 24
+        , 'multiStateOutOfRange':25
         }
 
 class RestartReason(Enumerated):
@@ -1850,6 +1928,7 @@ class RestartReason(Enumerated):
         , 'hardwareWatchdog':5
         , 'softwareWatchdog':6
         , 'suspended':7
+        , 'activateChanges':8
         }
 
 class SecurityLevel(Enumerated):
@@ -1997,34 +2076,34 @@ class RouterEntryStatus(Enumerated):
 
 class HostAddress(Choice):
     choiceElements = \
-        [ Element('none', Null)
-        , Element('ipAddress', OctetString)  # 4 octets for B/IP or 16 octets for B/IPv6
-        , Element('name', CharacterString)  # Internet host name (see RFC 1123)
+        [ Element('none', Null, 0)
+        , Element('ipAddress', OctetString, 1)  # 4 octets for B/IP or 16 octets for B/IPv6
+        , Element('name', CharacterString, 2)  # Internet host name (see RFC 1123)
         ]
 
 class HostNPort(Sequence):
     sequenceElements = \
-        [ Element('host', HostAddress)
-        , Element('port', Unsigned16)
+        [ Element('host', HostAddress, 0)
+        , Element('port', Unsigned16, 1)
         ]
 
 class BDTEntry(Sequence):
     sequenceElements = \
-        [ Element('bbmdAddress', HostNPort)
-        , Element('broadcastMask', OctetString)  # shall be present if BACnet/IP, and absent for BACnet/IPv6
+        [ Element('bbmdAddress', HostNPort, 0)
+        , Element('broadcastMask', OctetString, 1)  # shall be present if BACnet/IP, and absent for BACnet/IPv6
         ]
 
 class FDTEntry(Sequence):
     sequenceElements = \
-        [ Element('bacnetIPAddress', OctetString)  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
-        , Element('timeToLive', Unsigned16)  # time to live in seconds at the time of registration
-        , Element('remainingTimeToLive', Unsigned16)  # remaining time to live in seconds, incl. grace period
+        [ Element('bacnetIPAddress', OctetString, 0)  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
+        , Element('timeToLive', Unsigned16, 1)  # time to live in seconds at the time of registration
+        , Element('remainingTimeToLive', Unsigned16, 2)  # remaining time to live in seconds, incl. grace period
         ]
 
 class VMACEntry(Sequence):
     sequenceElements = \
-        [ Element('virtualMACAddress', OctetString)  # maximum size 6 octets
-        , Element('nativeMACAddress', OctetString)
+        [ Element('virtualMACAddress', OctetString, 0)  # maximum size 6 octets
+        , Element('nativeMACAddress', OctetString, 1)
         ]
 
 class PropertyReference(Sequence):
@@ -2035,9 +2114,10 @@ class PropertyReference(Sequence):
 
 class RouterEntry(Sequence):
     sequenceElements = \
-        [ Element('networkNumber', Unsigned16)
-        , Element('macAddress', OctetString)
-        , Element('status', RouterEntryStatus)  # Defined Above
+        [ Element('networkNumber', Unsigned16, 0)
+        , Element('macAddress', OctetString, 1)
+        , Element('status', RouterEntryStatus, 2)  # Defined Above
+        , Element('performanceIndex', Unsigned8, 3, True)
         ]
 
 @bacpypes_debugging
diff --git a/py34/bacpypes/object.py b/py34/bacpypes/object.py
index ef58862a..1485e5a1 100644
--- a/py34/bacpypes/object.py
+++ b/py34/bacpypes/object.py
@@ -2341,11 +2341,11 @@ class NetworkPortObject(Object):
         , ReadableProperty('protocolLevel', ProtocolLevel)  #482
         , OptionalProperty('referencePort', Unsigned)  #483
         , ReadableProperty('networkNumber', Unsigned16)  #425
-        , ReadableProperty('networkNumberQuality', NetworkNumberQuality)  #427
+        , ReadableProperty('networkNumberQuality', NetworkNumberQuality)  #426
         , ReadableProperty('changesPending', Boolean)  #416
         , OptionalProperty('command', NetworkPortCommand)   #417
         , OptionalProperty('macAddress', OctetString)   #423
-        , ReadableProperty('apduLength', Unsigned)  #388
+        , ReadableProperty('apduLength', Unsigned)  #399
         , ReadableProperty('linkSpeed', Real)  #420
         , OptionalProperty('linkSpeeds', ArrayOf(Real))  #421
         , OptionalProperty('linkSpeedAutonegotiate', Boolean)  #422
@@ -2375,7 +2375,7 @@ class NetworkPortObject(Object):
         , OptionalProperty('ipv6DefaultGateway', OctetString)  #439
         , OptionalProperty('bacnetIPv6MulticastAddress', OctetString)  #440
         , OptionalProperty('ipv6DNSServer', OctetString)  #441
-        , OptionalProperty('ipv6AutoAddressingEnabled', Boolean)  #442
+        , OptionalProperty('ipv6AutoAddressingEnable', Boolean)  #442
         , OptionalProperty('ipv6DHCPLeaseTime', Unsigned)  #443
         , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned)  #444
         , OptionalProperty('ipv6DHCPServer', OctetString)  #445
diff --git a/samples/OpenWeatherServer.py b/samples/OpenWeatherServer.py
index 6183c0d0..094f6974 100644
--- a/samples/OpenWeatherServer.py
+++ b/samples/OpenWeatherServer.py
@@ -185,8 +185,8 @@ def flatten(x, prefix="$"):
         yield (prefix, x)
 
 
-@recurring_function(APPINTERVAL)
 @bacpypes_debugging
+# @recurring_function(APPINTERVAL)
 def update_weather_data():
     """Read the current weather data from the API and set the object values."""
     if _debug:
diff --git a/sandbox/network_port_object.py b/sandbox/network_port_object.py
index 9d99530f..8e0cf95a 100644
--- a/sandbox/network_port_object.py
+++ b/sandbox/network_port_object.py
@@ -1,36 +1,130 @@
-
 from bacpypes.object import Object, ReadableProperty, OptionalProperty
 
-from bacpypes.primitivedata import Atomic, BitString, Boolean, CharacterString, Date, \
-    Double, Integer, ObjectIdentifier, ObjectType, OctetString, Real, Time, \
-    Unsigned, Tag, Enumerated, Null
-
-from bacpypes.constructeddata import AnyAtomic, Array, ArrayOf, List, ListOf, \
-    Choice, Element, Sequence
-
-from bacpypes.basetypes import AccessCredentialDisable, AccessCredentialDisableReason, \
-    AccessEvent, AccessPassbackMode, AccessRule, AccessThreatLevel, \
-    AccessUserType, AccessZoneOccupancyState, AccumulatorRecord, Action, \
-    ActionList, AddressBinding, AssignedAccessRights, AuthenticationFactor, \
-    AuthenticationFactorFormat, AuthenticationPolicy, AuthenticationStatus, \
-    AuthorizationException, AuthorizationMode, BackupState, BinaryPV, \
-    COVSubscription, CalendarEntry, ChannelValue, ClientCOV, \
-    CredentialAuthenticationFactor, DailySchedule, DateRange, DateTime, \
-    Destination, DeviceObjectPropertyReference, DeviceObjectReference, \
-    DeviceStatus, DoorAlarmState, DoorSecuredStatus, DoorStatus, DoorValue, \
-    EngineeringUnits, EventNotificationSubscription, EventParameter, \
-    EventState, EventTransitionBits, EventType, FaultParameter, FaultType, \
-    FileAccessMethod, LifeSafetyMode, LifeSafetyOperation, LifeSafetyState, \
-    LightingCommand, LightingInProgress, LightingTransition, LimitEnable, \
-    LockStatus, LogMultipleRecord, LogRecord, LogStatus, LoggingType, \
-    Maintenance, NetworkSecurityPolicy, NodeType, NotifyType, \
-    ObjectPropertyReference, ObjectTypesSupported, OptionalCharacterString, \
-    Polarity, PortPermission, Prescale, PriorityArray, ProcessIdSelection, \
-    ProgramError, ProgramRequest, ProgramState, PropertyAccessResult, \
-    PropertyIdentifier, Recipient, Reliability, RestartReason, Scale, \
-    SecurityKeySet, SecurityLevel, Segmentation, ServicesSupported, \
-    SetpointReference, ShedLevel, ShedState, SilencedState, SpecialEvent, \
-    StatusFlags, TimeStamp, VTClass, VTSession, WriteStatus
+from bacpypes.primitivedata import (
+    Atomic,
+    BitString,
+    Boolean,
+    CharacterString,
+    Date,
+    Double,
+    Integer,
+    ObjectIdentifier,
+    ObjectType,
+    OctetString,
+    Real,
+    Time,
+    Unsigned,
+    Tag,
+    Enumerated,
+    Null,
+)
+
+from bacpypes.constructeddata import (
+    AnyAtomic,
+    Array,
+    ArrayOf,
+    List,
+    ListOf,
+    Choice,
+    Element,
+    Sequence,
+)
+
+from bacpypes.basetypes import (
+    AccessCredentialDisable,
+    AccessCredentialDisableReason,
+    AccessEvent,
+    AccessPassbackMode,
+    AccessRule,
+    AccessThreatLevel,
+    AccessUserType,
+    AccessZoneOccupancyState,
+    AccumulatorRecord,
+    Action,
+    ActionList,
+    AddressBinding,
+    AssignedAccessRights,
+    AuthenticationFactor,
+    AuthenticationFactorFormat,
+    AuthenticationPolicy,
+    AuthenticationStatus,
+    AuthorizationException,
+    AuthorizationMode,
+    BackupState,
+    BinaryPV,
+    COVSubscription,
+    CalendarEntry,
+    ChannelValue,
+    ClientCOV,
+    CredentialAuthenticationFactor,
+    DailySchedule,
+    DateRange,
+    DateTime,
+    Destination,
+    DeviceObjectPropertyReference,
+    DeviceObjectReference,
+    DeviceStatus,
+    DoorAlarmState,
+    DoorSecuredStatus,
+    DoorStatus,
+    DoorValue,
+    EngineeringUnits,
+    EventNotificationSubscription,
+    EventParameter,
+    EventState,
+    EventTransitionBits,
+    EventType,
+    FaultParameter,
+    FaultType,
+    FileAccessMethod,
+    LifeSafetyMode,
+    LifeSafetyOperation,
+    LifeSafetyState,
+    LightingCommand,
+    LightingInProgress,
+    LightingTransition,
+    LimitEnable,
+    LockStatus,
+    LogMultipleRecord,
+    LogRecord,
+    LogStatus,
+    LoggingType,
+    Maintenance,
+    NetworkSecurityPolicy,
+    NodeType,
+    NotifyType,
+    ObjectPropertyReference,
+    ObjectTypesSupported,
+    OptionalCharacterString,
+    Polarity,
+    PortPermission,
+    Prescale,
+    PriorityArray,
+    ProcessIdSelection,
+    ProgramError,
+    ProgramRequest,
+    ProgramState,
+    PropertyAccessResult,
+    PropertyIdentifier,
+    Recipient,
+    Reliability,
+    RestartReason,
+    Scale,
+    SecurityKeySet,
+    SecurityLevel,
+    Segmentation,
+    ServicesSupported,
+    SetpointReference,
+    ShedLevel,
+    ShedState,
+    SilencedState,
+    SpecialEvent,
+    StatusFlags,
+    TimeStamp,
+    VTClass,
+    VTSession,
+    WriteStatus,
+)
 
 # TODO: add to objectIdentifier enumeration
 # TODO: add to objectTypesSupported
@@ -38,17 +132,15 @@
 # TODO: fix property names
 
 
-
-
 #
 #   NEW PRIMITIVES
 #
 
-class Unsigned8(Unsigned):
 
+class Unsigned8(Unsigned):
     _app_tag = Tag.unsignedAppTag
 
-    def __init__(self,arg = None):
+    def __init__(self, arg=None):
         Unsigned.__init__(self, arg)
         self.value = 0
 
@@ -65,7 +157,6 @@ def __init__(self,arg = None):
         else:
             raise TypeError("invalid constructor datatype")
 
-
     @classmethod
     def is_valid(cls, arg):
         """Return True if arg is valid value for the class."""
@@ -76,10 +167,9 @@ def __str__(self):
 
 
 class Unsigned16(Unsigned):
-
     _app_tag = Tag.unsignedAppTag
 
-    def __init__(self,arg = None):
+    def __init__(self, arg=None):
         Unsigned.__init__(self, arg)
         self.value = 0
 
@@ -96,7 +186,6 @@ def __init__(self,arg = None):
         else:
             raise TypeError("invalid constructor datatype")
 
-
     @classmethod
     def is_valid(cls, arg):
         """Return True if arg is valid value for the class."""
@@ -105,194 +194,207 @@ def is_valid(cls, arg):
     def __str__(self):
         return "%s(%s)" % (self.__class__.__name__, self.value)
 
+
 #
 #   NEW BASETYPES
 #
 
 # Enumerations
 
+
 class NetworkType(Enumerated):
-    enumerations = \
-        { 'ethernet':0
-        , 'arcnet':1
-        , 'mstp':2
-        , 'ptp':3
-        , 'lontalk':4
-        , 'ipv4':5
-        , 'zigbee':6
-        , 'virtual': 7
+    enumerations = {
+        "ethernet": 0,
+        "arcnet": 1,
+        "mstp": 2,
+        "ptp": 3,
+        "lontalk": 4,
+        "ipv4": 5,
+        "zigbee": 6,
+        "virtual": 7
         # , 'non-bacnet': 8  Removed in Version 1, Revision 18
-        , 'ipv6':9
-        , 'serial':10
-        }
+        ,
+        "ipv6": 9,
+        "serial": 10,
+    }
+
 
 class ProtocolLevel(Enumerated):
-    enumerations = \
-        { 'physical':0
-        , 'protocol':1
-        , 'bacnetApplication':2
-        , 'nonBacnetApplication':3
-        }
+    enumerations = {
+        "physical": 0,
+        "protocol": 1,
+        "bacnetApplication": 2,
+        "nonBacnetApplication": 3,
+    }
+
 
 class NetworkNumberQuality(Enumerated):
-    enumerations = \
-        { 'unknown':0
-        , 'learned':1
-        , 'learnedConfigured':2
-        , 'configured':3
-        }
+    enumerations = {"unknown": 0, "learned": 1, "learnedConfigured": 2, "configured": 3}
+
 
 class NetworkPortCommand(Enumerated):
-    enumerations = \
-        { 'idle':0
-        , 'discardChanges':1
-        , 'renewFdDRegistration':2
-        , 'restartSlaveDiscovery':3
-        , 'renewDHCP':4
-        , 'restartAutonegotiation':5
-        , 'disconnect':6
-        , 'restartPort':7
-        }
+    enumerations = {
+        "idle": 0,
+        "discardChanges": 1,
+        "renewFdDRegistration": 2,
+        "restartSlaveDiscovery": 3,
+        "renewDHCP": 4,
+        "restartAutonegotiation": 5,
+        "disconnect": 6,
+        "restartPort": 7,
+    }
+
 
 class IPMode(Enumerated):
-    enumerations = \
-        { 'normal':0
-        , 'foreign':1
-        , 'bbmd':2
-        }
+    enumerations = {"normal": 0, "foreign": 1, "bbmd": 2}
+
 
 class RouterEntryStatus(Enumerated):
     # This was defined directly in the RouterEntry Sequence in the standard, but I moved it up here because
     # I didn't see anywhere else you defined something that way.
-    enumerations = \
-        { 'available':0
-        , 'busy':1
-        , 'disconnected':2
-        }
+    enumerations = {"available": 0, "busy": 1, "disconnected": 2}
+
 
 # Choices
 
+
 class HostAddress(Choice):
-    choiceElements = \
-        [ Element('none', Null)
-        , Element('ipAddress', OctetString)  # 4 octets for B/IP or 16 octets for B/IPv6
-        , Element('name', CharacterString)  # Internet host name (see RFC 1123)
-        ]
+    choiceElements = [
+        Element("none", Null),
+        Element("ipAddress", OctetString),  # 4 octets for B/IP or 16 octets for B/IPv6
+        Element("name", CharacterString),  # Internet host name (see RFC 1123)
+    ]
+
 
 # Sequences
 
+
 class HostNPort(Sequence):
-    sequenceElements = \
-        [ Element('host', HostAddress)
-        , Element('port', Unsigned16)
-        ]
+    sequenceElements = [Element("host", HostAddress), Element("port", Unsigned16)]
+
 
 class BDTEntry(Sequence):
-    sequenceElements = \
-        [ Element('bbmdAddress', HostNPort)
-        , Element('broadcastMask', OctetString)  # shall be present if BACnet/IP, and absent for BACnet/IPv6
-        ]
+    sequenceElements = [
+        Element("bbmdAddress", HostNPort),
+        Element(
+            "broadcastMask", OctetString
+        ),  # shall be present if BACnet/IP, and absent for BACnet/IPv6
+    ]
+
 
 class FDTEntry(Sequence):
-    sequenceElements = \
-        [ Element('bacnetIPAddress', OctetString)  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
-        , Element('timeToLive', Unsigned16)  # time to live in seconds at the time of registration
-        , Element('remainingTimeToLive', Unsigned16)  # remaining time to live in seconds, incl. grace period
-        ]
+    sequenceElements = [
+        Element(
+            "bacnetIPAddress", OctetString
+        ),  # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
+        Element(
+            "timeToLive", Unsigned16
+        ),  # time to live in seconds at the time of registration
+        Element(
+            "remainingTimeToLive", Unsigned16
+        ),  # remaining time to live in seconds, incl. grace period
+    ]
+
 
 class VMACEntry(Sequence):
-    sequenceElements = \
-        [ Element('virtualMACAddress', OctetString)  # maximum size 6 octets
-        , Element('nativeMACAddress', OctetString)
-        ]
+    sequenceElements = [
+        Element("virtualMACAddress", OctetString),  # maximum size 6 octets
+        Element("nativeMACAddress", OctetString),
+    ]
+
 
 class RouterEntry(Sequence):
-    sequenceElements = \
-        [ Element('networkNumber', Unsigned16)
-        , Element('macAddress', OctetString)
-        , Element('status', RouterEntryStatus)  # Defined Above
-        ]
+    sequenceElements = [
+        Element("networkNumber", Unsigned16),
+        Element("macAddress", OctetString),
+        Element("status", RouterEntryStatus),  # Defined Above
+    ]
+
 
 class NameValue(Sequence):
-    sequenceElements = \
-        [ Element('name', CharacterString)
-        , Element('value', Atomic)  # IS ATOMIC CORRECT HERE? value is limited to primitive datatypes and BACnetDateTime
-        ]
+    sequenceElements = [
+        Element("name", CharacterString),
+        Element(
+            "value", Atomic
+        ),  # IS ATOMIC CORRECT HERE? value is limited to primitive datatypes and BACnetDateTime
+    ]
+
 
 #
 #   NEW OBJECT
 #
 
+
 class NetworkPortObject(Object):
-    objectType = 'NetworkPort'  #56
-    properties = \
-        [ ReadableProperty('statusFlags', StatusFlags)  #111
-        , ReadableProperty('reliability', Reliability)  #103
-        , ReadableProperty('outOfService', Boolean) #81
-        , ReadableProperty('networkType', NetworkType)  #427
-        , ReadableProperty('protocolLevel', ProtocolLevel)  #482
-        , OptionalProperty('referencePort', Unsigned)   #483
-        , ReadableProperty('networkNumber', Unsigned16) #425
-        , ReadableProperty('networkNumberQuality', NetworkNumberQuality)    #427
-        , ReadableProperty('changesPending', Boolean)   #416
-        , OptionalProperty('command', NetworkPortCommand)   #417
-        , OptionalProperty('macAddress', OctetString)   #423
-        , ReadableProperty('apduLength', Unsigned)  #388
-        , ReadableProperty('linkSpeed', Real)   #420
-        , OptionalProperty('linkSpeeds', ArrayOf(Real)) #421
-        , OptionalProperty('eventTimeStamps', ArrayOf(TimeStamp))   #130
-        , OptionalProperty('linkSpeedAutonegotiate', Boolean)   #422
-        , OptionalProperty('networkInterfaceName', CharacterString) #424
-        , OptionalProperty('ipMode', IPMode)    #408
-        , OptionalProperty('ipAddress', OctetString) #400
-        , OptionalProperty('ipUDPPort', Unsigned16) #412
-        , OptionalProperty('ipSubnetMask', OctetString) #411
-        , OptionalProperty('ipDefaultGateway', OctetString) #401
-        , OptionalProperty('ipMulticastAddress', OctetString)   #409
-        , OptionalProperty('ipDNSServer', ArrayOf(OctetString)) #406
-        , OptionalProperty('ipDHCPEnable', Boolean) #402
-        , OptionalProperty('ipDHCPLeaseTime', Unsigned) #403
-        , OptionalProperty('ipDHCPLeaseTimeRemaining', Unsigned)    #404
-        , OptionalProperty('ipDHCPServer', OctetString) #405
-        , OptionalProperty('ipNATTraversal', Boolean)   #410
-        , OptionalProperty('ipGlobalAddress', HostNPort)    #407
-        , OptionalProperty('broadcastDistributionTable', ListOf(BDTEntry))  #414
-        , OptionalProperty('acceptFDRegistrations', Boolean)    #413
-        , OptionalProperty('bbmdForeignDeviceTable', ListOf(FDTEntry))  #415
-        , OptionalProperty('fdBBMDAddress', HostNPort)  #418
-        , OptionalProperty('fdSubscriptionLifetime', Unsigned16)    #419
-        , OptionalProperty('ipv6Mode', IPMode)  #435
-        , OptionalProperty('ipv6Address', OctetString)  #436
-        , OptionalProperty('ipv6PrefixLength', Unsigned8)   #437
-        , OptionalProperty('ipv6UDPPort', Unsigned16)   #438
-        , OptionalProperty('ipv6DefaultGateway', OctetString)   #439
-        , OptionalProperty('ipv6MulticastAddress', OctetString) #440
-        , OptionalProperty('ipv6DNSServer', OctetString)    #441
-        , OptionalProperty('ipv6AutoAddressingEnabled', Boolean)    #442
-        , OptionalProperty('ipv6DHCPLeaseTime', Unsigned)   #443
-        , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned)  #444
-        , OptionalProperty('ipv6DHCPServer', OctetString)   #445
-        , OptionalProperty('ipv6ZoneIndex', CharacterString)    #446
-        , OptionalProperty('maxMasters', Unsigned8) # range 0-127   #64
-        , OptionalProperty('maxInfoFrames', Unsigned8)  #63
-        , OptionalProperty('slaveProxyEnable', Boolean) #172
-        , OptionalProperty('manualSlaveAddressBinding', ListOf(AddressBinding)) #170
-        , OptionalProperty('autoSlaveDiscovery', Boolean)   #169
-        , OptionalProperty('slaveAddressBinding', ListOf(AddressBinding))   #171
-        , OptionalProperty('virtualMACAddressTable', ListOf(VMACEntry)) #429
-        , OptionalProperty('routingTable', ListOf(RouterEntry)) #428
-        , OptionalProperty('eventDetectionEnabled', Boolean)    #353
-        , OptionalProperty('notificationClass', Unsigned)   #17
-        , OptionalProperty('eventEnable', EventTransitionBits)  #35
-        , OptionalProperty('ackedTransitions', EventTransitionBits) #0
-        , OptionalProperty('notifyType', NotifyType)    #72
-        , OptionalProperty('eventTimeStamps', ArrayOf(TimeStamp, 3))    #130
-        , OptionalProperty('eventMessageTexts', ArrayOf(CharacterString, 3))    #351
-        , OptionalProperty('eventMessageTextsConfig', ArrayOf(CharacterString, 3))  #352
-        , OptionalProperty('eventState', EventState)    #36
-        , ReadableProperty('reliabilityEvaluationInhibit', Boolean) #357
-        , OptionalProperty('propertyList', ArrayOf(PropertyIdentifier)) #371
-        , OptionalProperty('tags', ArrayOf(NameValue))  #486
-        , OptionalProperty('profileLocation', CharacterString)  #91
-        , OptionalProperty('profileName', CharacterString)  #168
-        ]
+    objectType = "NetworkPort"  # 56
+    properties = [
+        ReadableProperty("statusFlags", StatusFlags),  # 111
+        ReadableProperty("reliability", Reliability),  # 103
+        ReadableProperty("outOfService", Boolean),  # 81
+        ReadableProperty("networkType", NetworkType),  # 427
+        ReadableProperty("protocolLevel", ProtocolLevel),  # 482
+        OptionalProperty("referencePort", Unsigned),  # 483
+        ReadableProperty("networkNumber", Unsigned16),  # 425
+        ReadableProperty("networkNumberQuality", NetworkNumberQuality),  # 426
+        ReadableProperty("changesPending", Boolean),  # 416
+        OptionalProperty("command", NetworkPortCommand),  # 417
+        OptionalProperty("macAddress", OctetString),  # 423
+        ReadableProperty("apduLength", Unsigned),  # 399
+        ReadableProperty("linkSpeed", Real),  # 420
+        OptionalProperty("linkSpeeds", ArrayOf(Real)),  # 421
+        OptionalProperty("eventTimeStamps", ArrayOf(TimeStamp)),  # 130
+        OptionalProperty("linkSpeedAutonegotiate", Boolean),  # 422
+        OptionalProperty("networkInterfaceName", CharacterString),  # 424
+        OptionalProperty("ipMode", IPMode),  # 408
+        OptionalProperty("ipAddress", OctetString),  # 400
+        OptionalProperty("ipUDPPort", Unsigned16),  # 412
+        OptionalProperty("ipSubnetMask", OctetString),  # 411
+        OptionalProperty("ipDefaultGateway", OctetString),  # 401
+        OptionalProperty("ipMulticastAddress", OctetString),  # 409
+        OptionalProperty("ipDNSServer", ArrayOf(OctetString)),  # 406
+        OptionalProperty("ipDHCPEnable", Boolean),  # 402
+        OptionalProperty("ipDHCPLeaseTime", Unsigned),  # 403
+        OptionalProperty("ipDHCPLeaseTimeRemaining", Unsigned),  # 404
+        OptionalProperty("ipDHCPServer", OctetString),  # 405
+        OptionalProperty("ipNATTraversal", Boolean),  # 410
+        OptionalProperty("ipGlobalAddress", HostNPort),  # 407
+        OptionalProperty("broadcastDistributionTable", ListOf(BDTEntry)),  # 414
+        OptionalProperty("acceptFDRegistrations", Boolean),  # 413
+        OptionalProperty("bbmdForeignDeviceTable", ListOf(FDTEntry)),  # 415
+        OptionalProperty("fdBBMDAddress", HostNPort),  # 418
+        OptionalProperty("fdSubscriptionLifetime", Unsigned16),  # 419
+        OptionalProperty("ipv6Mode", IPMode),  # 435
+        OptionalProperty("ipv6Address", OctetString),  # 436
+        OptionalProperty("ipv6PrefixLength", Unsigned8),  # 437
+        OptionalProperty("ipv6UDPPort", Unsigned16),  # 438
+        OptionalProperty("ipv6DefaultGateway", OctetString),  # 439
+        OptionalProperty("ipv6MulticastAddress", OctetString),  # 440
+        OptionalProperty("ipv6DNSServer", OctetString),  # 441
+        OptionalProperty("ipv6AutoAddressingEnable", Boolean),  # 442
+        OptionalProperty("ipv6DHCPLeaseTime", Unsigned),  # 443
+        OptionalProperty("ipv6DHCPLeaseTimeRemaining", Unsigned),  # 444
+        OptionalProperty("ipv6DHCPServer", OctetString),  # 445
+        OptionalProperty("ipv6ZoneIndex", CharacterString),  # 446
+        OptionalProperty("maxMasters", Unsigned8),  # range 0-127   #64
+        OptionalProperty("maxInfoFrames", Unsigned8),  # 63
+        OptionalProperty("slaveProxyEnable", Boolean),  # 172
+        OptionalProperty("manualSlaveAddressBinding", ListOf(AddressBinding)),  # 170
+        OptionalProperty("autoSlaveDiscovery", Boolean),  # 169
+        OptionalProperty("slaveAddressBinding", ListOf(AddressBinding)),  # 171
+        OptionalProperty("virtualMACAddressTable", ListOf(VMACEntry)),  # 429
+        OptionalProperty("routingTable", ListOf(RouterEntry)),  # 428
+        OptionalProperty("eventDetectionEnabled", Boolean),  # 353
+        OptionalProperty("notificationClass", Unsigned),  # 17
+        OptionalProperty("eventEnable", EventTransitionBits),  # 35
+        OptionalProperty("ackedTransitions", EventTransitionBits),  # 0
+        OptionalProperty("notifyType", NotifyType),  # 72
+        OptionalProperty("eventTimeStamps", ArrayOf(TimeStamp, 3)),  # 130
+        OptionalProperty("eventMessageTexts", ArrayOf(CharacterString, 3)),  # 351
+        OptionalProperty("eventMessageTextsConfig", ArrayOf(CharacterString, 3)),  # 352
+        OptionalProperty("eventState", EventState),  # 36
+        ReadableProperty("reliabilityEvaluationInhibit", Boolean),  # 357
+        OptionalProperty("propertyList", ArrayOf(PropertyIdentifier)),  # 371
+        OptionalProperty("tags", ArrayOf(NameValue)),  # 486
+        OptionalProperty("profileLocation", CharacterString),  # 91
+        OptionalProperty("profileName", CharacterString),  # 168
+    ]
diff --git a/setup.py b/setup.py
index 5ffef004..0ec7eacd 100644
--- a/setup.py
+++ b/setup.py
@@ -21,6 +21,8 @@
     (3, 6): 'py34',
     (3, 7): 'py34',
     (3, 8): 'py34',
+    (3, 9): 'py34',
+    (3, 10): 'py34',
     }.get(version_info, None)
 if not source_folder:
     raise EnvironmentError("unsupported version of Python")