diff --git a/CHANGELOG b/CHANGELOG
index e5e1b8ad..3397760f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,3 @@
-4.0.4
-
-    * Fixes bug with pulling the userData property for the virtual server detail
-
-    * Fixes a class of bugs invloving unicode from the API
-
 4.0.3
 
     * Fixes bug with `slcli vs ready` command
diff --git a/SoftLayer/CLI/formatting.py b/SoftLayer/CLI/formatting.py
index 6f35a985..4f10980d 100644
--- a/SoftLayer/CLI/formatting.py
+++ b/SoftLayer/CLI/formatting.py
@@ -50,7 +50,7 @@ def format_output(data, fmt='table'):  # pylint: disable=R0911,R0912
     # responds to .formatted
     if hasattr(data, 'formatted'):
         if fmt == 'table':
-            return data.formatted
+            return str(data.formatted)
 
     # responds to .separator
     if hasattr(data, 'separator'):
diff --git a/SoftLayer/CLI/server/detail.py b/SoftLayer/CLI/server/detail.py
index 943b694b..9fc76c5d 100644
--- a/SoftLayer/CLI/server/detail.py
+++ b/SoftLayer/CLI/server/detail.py
@@ -96,8 +96,10 @@ def cli(env, identifier, passwords, price):
         table.add_row(['remote users', pass_table])
 
     tag_row = []
-    for tag in result['tagReferences']:
-        tag_row.append(tag['tag']['name'])
+    for tag_detail in result['tagReferences']:
+        tag = utils.lookup(tag_detail, 'tag', 'name')
+        if tag is not None:
+            tag_row.append(tag)
 
     if tag_row:
         table.add_row(['tags', formatting.listing(tag_row, separator=',')])
diff --git a/SoftLayer/CLI/virt/detail.py b/SoftLayer/CLI/virt/detail.py
index 3afe151e..4fc115ce 100644
--- a/SoftLayer/CLI/virt/detail.py
+++ b/SoftLayer/CLI/virt/detail.py
@@ -93,8 +93,10 @@ def cli(self, identifier, passwords=False, price=False):
         table.add_row(['users', pass_table])
 
     tag_row = []
-    for tag in result['tagReferences']:
-        tag_row.append(tag['tag']['name'])
+    for tag_detail in result['tagReferences']:
+        tag = utils.lookup(tag_detail, 'tag', 'name')
+        if tag is not None:
+            tag_row.append(tag)
 
     if tag_row:
         table.add_row(['tags', formatting.listing(tag_row, separator=', ')])
diff --git a/SoftLayer/consts.py b/SoftLayer/consts.py
index 0279225c..674f0460 100644
--- a/SoftLayer/consts.py
+++ b/SoftLayer/consts.py
@@ -5,7 +5,7 @@
 
     :license: MIT, see LICENSE for more details.
 """
-VERSION = 'v4.0.4'
+VERSION = 'v4.0.3'
 API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/xmlrpc/v3.1/'
 API_PRIVATE_ENDPOINT = 'https://api.service.softlayer.com/xmlrpc/v3.1/'
 API_PUBLIC_ENDPOINT_REST = 'https://api.softlayer.com/rest/v3.1/'
diff --git a/SoftLayer/managers/vs.py b/SoftLayer/managers/vs.py
index 30de90b3..ebd523f4 100644
--- a/SoftLayer/managers/vs.py
+++ b/SoftLayer/managers/vs.py
@@ -191,6 +191,7 @@ def get_instance(self, instance_id, **kwargs):
                 'blockDevices',
                 'blockDeviceTemplateGroup[id, name, globalIdentifier]',
                 'postInstallScriptUri',
+                'userData',
                 '''operatingSystem[passwords[username,password],
                                    softwareLicense.softwareDescription[
                                        manufacturer,name,version,
diff --git a/docs/conf.py b/docs/conf.py
index 8f480496..0472001b 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -55,9 +55,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = '4.0.4'
+version = '4.0.3'
 # The full version, including alpha/beta/rc tags.
-release = '4.0.4'
+release = '4.0.3'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/setup.py b/setup.py
index 3f329b77..88132dbe 100644
--- a/setup.py
+++ b/setup.py
@@ -36,7 +36,7 @@
 
 setup(
     name='SoftLayer',
-    version='4.0.4',
+    version='4.0.3',
     description=DESCRIPTION,
     long_description=LONG_DESCRIPTION,
     author='SoftLayer Technologies, Inc.',

slcli server detail example01 (KeyError: 'tag')

Hello 

I am running 

slcli server detail hostname

against our entire SLR inventory (200 servers) for most of them I get expected output but for 4 out of the 100 I get this:

```
➜  ~  slcli server detail example01
An unexpected error has occured:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/SoftLayer-4.0.2-py2.7.egg/SoftLayer/CLI/core.py", line 181, in main
    cli.main()
  File "/usr/local/lib/python2.7/site-packages/click-4.0-py2.7.egg/click/core.py", line 644, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python2.7/site-packages/click-4.0-py2.7.egg/click/core.py", line 991, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python2.7/site-packages/click-4.0-py2.7.egg/click/core.py", line 991, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python2.7/site-packages/click-4.0-py2.7.egg/click/core.py", line 837, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python2.7/site-packages/click-4.0-py2.7.egg/click/core.py", line 464, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/click-4.0-py2.7.egg/click/decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args[1:], **kwargs)
  File "/usr/local/lib/python2.7/site-packages/click-4.0-py2.7.egg/click/core.py", line 464, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/SoftLayer-4.0.2-py2.7.egg/SoftLayer/CLI/server/detail.py", line 100, in cli
    tag_row.append(tag['tag']['name'])
KeyError: 'tag'

Feel free to report this error as it is likely a bug:
    https://github.com/softlayer/softlayer-python/issues
```

I tried it under

```
➜  ~  python -V
Python 2.7.10
```

and 

```
(softlayer)➜  ~  python -V
Python 3.4.3
```
diff --git a/SoftLayer/tests/CLI/helper_tests.py b/SoftLayer/tests/CLI/helper_tests.py
index 873d58a8..7862ef00 100644
--- a/SoftLayer/tests/CLI/helper_tests.py
+++ b/SoftLayer/tests/CLI/helper_tests.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """
     SoftLayer.tests.CLI.helper_tests
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -358,17 +357,6 @@ def test_format_output_python_keyvaluetable(self):
         ret = formatting.format_output(t, 'python')
         self.assertEqual({'nothing': None}, ret)
 
-    def test_format_output_unicode(self):
-        t = formatting.format_output('☃', 'raw')
-        self.assertEqual('☃', t)
-
-        item = formatting.FormattedItem('raw ☃', '☃')
-        t = formatting.format_output(item)
-        self.assertEqual('☃', t)
-
-        t = formatting.format_output(item, 'raw')
-        self.assertEqual('raw ☃', t)
-
 
 class TestTemplateArgs(testing.TestCase):
 
diff --git a/SoftLayer/tests/CLI/modules/server_tests.py b/SoftLayer/tests/CLI/modules/server_tests.py
index 85df2f42..e41e49cd 100644
--- a/SoftLayer/tests/CLI/modules/server_tests.py
+++ b/SoftLayer/tests/CLI/modules/server_tests.py
@@ -57,6 +57,25 @@ def test_server_details(self):
         self.assertEqual(result.exit_code, 0)
         self.assertEqual(json.loads(result.output), expected)
 
+    def test_detail_vs_empty_tag(self):
+        mock = self.set_mock('SoftLayer_Hardware_Server', 'getObject')
+        mock.return_value = {
+            'id': 100,
+            'processorPhysicalCoreAmount': 2,
+            'memoryCapacity': 2,
+            'tagReferences': [
+                {'tag': {'name': 'example-tag'}},
+                {},
+            ],
+        }
+        result = self.run_command(['server', 'detail', '100'])
+
+        self.assertEqual(result.exit_code, 0)
+        self.assertEqual(
+            json.loads(result.output)['tags'],
+            ['example-tag'],
+        )
+
     def test_list_servers(self):
         result = self.run_command(['server', 'list', '--tag=openstack'])
 
diff --git a/SoftLayer/tests/CLI/modules/vs_tests.py b/SoftLayer/tests/CLI/modules/vs_tests.py
index 9c1064bd..76dd75e5 100644
--- a/SoftLayer/tests/CLI/modules/vs_tests.py
+++ b/SoftLayer/tests/CLI/modules/vs_tests.py
@@ -66,6 +66,25 @@ def test_detail_vs(self):
                                      'id': 1}],
                           'owner': 'chechu'})
 
+    def test_detail_vs_empty_tag(self):
+        mock = self.set_mock('SoftLayer_Virtual_Guest', 'getObject')
+        mock.return_value = {
+            'id': 100,
+            'maxCpu': 2,
+            'maxMemory': 1024,
+            'tagReferences': [
+                {'tag': {'name': 'example-tag'}},
+                {},
+            ],
+        }
+        result = self.run_command(['vs', 'detail', '100'])
+
+        self.assertEqual(result.exit_code, 0)
+        self.assertEqual(
+            json.loads(result.output)['tags'],
+            ['example-tag'],
+        )
+
     def test_create_options(self):
         result = self.run_command(['vs', 'create-options'])
 

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.6
tools/test-requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
attrs==22.2.0
Babel==2.11.0
certifi==2021.5.30
charset-normalizer==2.0.12
click==8.0.4
coverage==6.2
distlib==0.3.9
docutils==0.18.1
filelock==3.4.1
fixtures==4.0.1
idna==3.10
imagesize==1.4.1
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig==1.1.1
Jinja2==3.0.3
MarkupSafe==2.0.1
mock==5.2.0
nose==1.3.7
packaging==21.3
pbr==6.1.1
platformdirs==2.4.0
pluggy==1.0.0
prettytable==2.5.0
py==1.11.0
Pygments==2.14.0
pyparsing==3.1.4
pytest==7.0.1
pytz==2025.2
requests==2.27.1
six==1.17.0
snowballstemmer==2.2.0
-e git+https://github.com/softlayer/softlayer-python.git@7d3772b40ea8cb46065ecb4756d4746d02bfbf61#egg=SoftLayer
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
testtools==2.6.0
toml==0.10.2
tomli==1.2.3
tox==3.28.0
typing_extensions==4.1.1
urllib3==1.26.20
virtualenv==20.17.1
wcwidth==0.2.13
zipp==3.6.0

name: softlayer-python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - attrs==22.2.0
      - babel==2.11.0
      - charset-normalizer==2.0.12
      - click==8.0.4
      - coverage==6.2
      - distlib==0.3.9
      - docutils==0.18.1
      - filelock==3.4.1
      - fixtures==4.0.1
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - mock==5.2.0
      - nose==1.3.7
      - packaging==21.3
      - pbr==6.1.1
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - prettytable==2.5.0
      - py==1.11.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytz==2025.2
      - requests==2.27.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - testtools==2.6.0
      - toml==0.10.2
      - tomli==1.2.3
      - tox==3.28.0
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - virtualenv==20.17.1
      - wcwidth==0.2.13
      - zipp==3.6.0
prefix: /opt/conda/envs/softlayer-python

SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_detail_vs_empty_tag SoftLayer/tests/CLI/modules/vs_tests.py::DnsTests::test_detail_vs_empty_tag
SoftLayer/tests/CLI/helper_tests.py::CLIJSONEncoderTest::test_default SoftLayer/tests/CLI/helper_tests.py::CLIJSONEncoderTest::test_fail SoftLayer/tests/CLI/helper_tests.py::PromptTests::test_confirmation SoftLayer/tests/CLI/helper_tests.py::PromptTests::test_do_or_die SoftLayer/tests/CLI/helper_tests.py::FormattedItemTests::test_blank SoftLayer/tests/CLI/helper_tests.py::FormattedItemTests::test_gb SoftLayer/tests/CLI/helper_tests.py::FormattedItemTests::test_init SoftLayer/tests/CLI/helper_tests.py::FormattedItemTests::test_mb_to_gb SoftLayer/tests/CLI/helper_tests.py::FormattedItemTests::test_sort SoftLayer/tests/CLI/helper_tests.py::FormattedItemTests::test_sort_mixed SoftLayer/tests/CLI/helper_tests.py::FormattedListTests::test_init SoftLayer/tests/CLI/helper_tests.py::FormattedListTests::test_str SoftLayer/tests/CLI/helper_tests.py::FormattedListTests::test_to_python SoftLayer/tests/CLI/helper_tests.py::FormattedTxnTests::test_active_txn SoftLayer/tests/CLI/helper_tests.py::FormattedTxnTests::test_active_txn_empty SoftLayer/tests/CLI/helper_tests.py::FormattedTxnTests::test_active_txn_missing SoftLayer/tests/CLI/helper_tests.py::FormattedTxnTests::test_transaction_status SoftLayer/tests/CLI/helper_tests.py::FormattedTxnTests::test_transaction_status_missing SoftLayer/tests/CLI/helper_tests.py::CLIAbortTests::test_init SoftLayer/tests/CLI/helper_tests.py::ResolveIdTests::test_resolve_id_multiple SoftLayer/tests/CLI/helper_tests.py::ResolveIdTests::test_resolve_id_none SoftLayer/tests/CLI/helper_tests.py::ResolveIdTests::test_resolve_id_one SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_formatted_item SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_json SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_json_keyvaluetable SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_list SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_python SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_python_keyvaluetable SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_raw SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_string SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_format_output_table SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_sequentialoutput SoftLayer/tests/CLI/helper_tests.py::TestFormatOutput::test_unknown SoftLayer/tests/CLI/helper_tests.py::TestTemplateArgs::test_no_template_option SoftLayer/tests/CLI/helper_tests.py::TestTemplateArgs::test_template_options SoftLayer/tests/CLI/helper_tests.py::TestExportToTemplate::test_export_to_template SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_cancel_server SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_options SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_missing_required SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_test_flag SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_create_server_with_export SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_failed SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_userdata SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_userdata_and_file SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_edit_server_userfile SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_list_servers SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_nic_edit_server SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_cancel_reasons SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_details SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_cycle SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_cycle_negative SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_off SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_power_on SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_default SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_hard SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_negative SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reboot_soft SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_server_reload SoftLayer/tests/CLI/modules/server_tests.py::ServerCLITests::test_update_firmware SoftLayer/tests/CLI/modules/vs_tests.py::DnsTests::test_create SoftLayer/tests/CLI/modules/vs_tests.py::DnsTests::test_create_options SoftLayer/tests/CLI/modules/vs_tests.py::DnsTests::test_detail_vs SoftLayer/tests/CLI/modules/vs_tests.py::DnsTests::test_list_vs
docs/conf.py SoftLayer/CLI/formatting.py setup.py SoftLayer/consts.py SoftLayer/CLI/virt/detail.py SoftLayer/CLI/server/detail.py SoftLayer/managers/vs.py CHANGELOG
docs/conf.py SoftLayer/CLI/formatting.py setup.py SoftLayer/consts.py SoftLayer/CLI/virt/detail.py SoftLayer/CLI/server/detail.py SoftLayer/managers/vs.py CHANGELOG