Repository: alttester/AltTester-Unity-SDK (language: python)

Issue:
[Demo] GetScreenshot improvements

Regular input stops working while SDK is connected to AltProxy
<!-- Short summary -->
## Actual result

### AR
<!-- How does the app behave in this scenario? --> 
Before using AltProxy it was ok for the SDK to use the custom input system when connected to the tests or to the desktop.
Now it becomes a problem as SDK needs to be connected to the proxy all the time which **❗stops regular input from working**.

### Additional info
<!-- Add screenshots or recording that shows how the app misbehaves. Logs and the OS on which the bug was reproduced could also come in handy. --> 
- The finding of this bug occurred when trying and not succeding to use the keyboard input in an instrumented TrashCat game (WebGL build with AltTester Unity SDK from `feature-proxy` branch)
- This behavior has a significant impact on the AltTester Desktop users not being able to use all types of inputs in the instrumented builds while using the Desktop app (even though in running tests the input should be handled)

## Expected result

### ER
<!-- How do you expect the app to behave in this scenario? --> 
Regular input should work when SDK is connected to AltProxy.

## Testability
<!-- Add suggestions on how to test the bugfix. -->
Check in an TrashCat instrumented build while connected to the proxy that the input from the keyboard works.


Discussion / hints:

@sandraaltom I put this in `Backlog`, but it should be decided with the dev team how to prioritize it considering the impact it has on the functionality of instrumented builds in relation to using the Desktop app.
@iulianatodoran please also check this issue on the current released version. 
PR #1090 will fix this issue. 

It will also change the way `AltDialog` works: 

* Before the App is connected to the Proxy Sever the dialog message will be: `Waiting to connect to AltProxy on [...].`.
* After the App is connected to the Proxy Server the dialog message will be: `Connected to AltProxy on [...]. Waiting for driver.`. Until a Driver is connected the input will work. 
* After the both an App and a Driver are connected to the Proxy Server the dialog message will be minimized and the message will be: `Connected to AltProxy on [...]. Driver connected.`. And the input is disabled. 
* When all the Drivers disconnects the `AltDialog` is maximize and the message will be: `Connected to AltProxy on [...]. Waiting for driver.`. And the input will be enabled again. 

### Testing environment
- OS: Windows 11, MacOS Big Sur v 11.7.2
- builds created in Unity version 2021.3.16f1 LTS
- _AltTester Desktop_ project from `development` branch (21.02.2023)
- _Samplescenes_  and _TrashCat_ games instrumented with AltTester Unity SDK from `development` branch

### Issues found during testing
- Context: Instrumented game connected with the Desktop app (and AltProxy started from Desktop)
- Issue: ❗ After clicking on the `Restart` button in `AltDialog` (from `AltTesterPrefab`), after the Desktop reconnects >> **AR**: the AltDialog message is `Connected to AltProxy on [...]. Waiting for driver to connect` instead of >> **ER**: `Connected to AltProxy on [...]. Driver connected.`

### Conclusions
For the above-mentioned issue **will reopen the ticket**
This issue should be fixed in PR: #1140.
Retested and the issue mentioned in the above comment reproduces if the `Restart` action is performed at least twice after the first connection with the Server.

@robert-altom I am reopening the ticket.

Fix patch:
diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml
index 9e5d1b589..5e0c5cc47 100644
--- a/.github/workflows/push.yml
+++ b/.github/workflows/push.yml
@@ -37,7 +37,7 @@ jobs:
 
       - name: Build SampleGame
         run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           $UNITY_2021_3_HOME -batchmode -stackTraceLogType None -projectPath $CI_PROJECT_DIR -executeMethod AltTesterTools.BuildAltTester.MacBuildFromCommandLine -logFile buildMac.log -quit
 
@@ -61,12 +61,12 @@ jobs:
           name: BuildMacArtifact
 
       - run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           chmod -R 755 sampleGame.app
           open sampleGame.app
       - run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           $UNITY_2021_3_HOME -batchmode -stackTraceLogType None -projectPath $CI_PROJECT_DIR -executeMethod AltTester.AltTesterUnitySDK.Editor.AltTestRunner.RunTestFromCommandLine -testsAssembly Assembly-CSharp-Editor  -logFile - -quit
       #TODO add back -reportPath $CI_PROJECT_DIR/reportTest.xml for removing because it's giving me unauthorized error
@@ -93,7 +93,7 @@ jobs:
         uses: actions/setup-dotnet@v2.1.1
 
       - run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           echo $ALTSERVER_PORT
           export ALTSERVER_HOST="127.0.0.1"
           chmod -R 755  sampleGame.app
@@ -119,7 +119,7 @@ jobs:
 
       - name: Open application
         run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           chmod -R 755 sampleGame.app
           open sampleGame.app
@@ -145,7 +145,7 @@ jobs:
 
       - name: Run integration tests
         run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           pytest Bindings~/python/tests/integration
 
@@ -176,7 +176,7 @@ jobs:
         uses: stCarolas/setup-maven@v4.5
 
       - run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           echo $ALTSERVER_PORT
           export ALTSERVER_HOST="127.0.0.1"
           chmod -R 755  sampleGame.app
diff --git a/.github/workflows/webgl.yml b/.github/workflows/webgl.yml
index 872a28ea5..ff308fc81 100644
--- a/.github/workflows/webgl.yml
+++ b/.github/workflows/webgl.yml
@@ -14,7 +14,7 @@ jobs:
       - uses: actions/checkout@v3
 
       - run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           $UNITY_2021_3_HOME -batchmode -stackTraceLogType None -projectPath $CI_PROJECT_DIR -executeMethod AltTesterTools.BuildAltTester.WebGLBuildFromCommandLine -logFile buildWebGL.log -quit
 
@@ -43,7 +43,7 @@ jobs:
         uses: actions/setup-dotnet@v2.1.1
 
       - run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           cd build/webgl
           python3 -m http.server --cgi 8360 &
@@ -78,7 +78,7 @@ jobs:
 
       - name: Open application
         run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           cd build/webgl
           python3 -m http.server --cgi 8360 &
@@ -100,7 +100,7 @@ jobs:
 
       - name: Run integration tests
         run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           pytest Bindings~/python/tests/integration -m "not WebGLUnsupported"
 
@@ -136,7 +136,7 @@ jobs:
       - uses: stCarolas/setup-maven@v4.4
 
       - run: |
-          export ALTSERVER_PORT=13020
+          export ALTSERVER_PORT=13010
           export ALTSERVER_HOST="127.0.0.1"
           cd build/webgl
           python3 -m http.server --cgi 8360 &
diff --git a/Assets/AltTester/Editor/Sprites.meta b/Assets/AltTester/Editor/Sprites.meta
index fdc8d585b..81b04d326 100644
--- a/Assets/AltTester/Editor/Sprites.meta
+++ b/Assets/AltTester/Editor/Sprites.meta
@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: 9f3551d71027f6e4995066f6c46d518f
+guid: dad12aad268c3e44d846b8fc62419747
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
+  userData:
+  assetBundleName:
+  assetBundleVariant:
diff --git a/Assets/AltTester/LICENSE b/Assets/AltTester/LICENSE
index 672e447b3..ce92f42e7 100644
--- a/Assets/AltTester/LICENSE
+++ b/Assets/AltTester/LICENSE
@@ -1,673 +1,3 @@
-                     GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+# License
 
- Copyright (C) 2022 Altom Consulting <https://altom.com/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    Copyright (C) 2022  Altom Consulting
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    Copyright (C) 2022  Altom Consulting
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
\ No newline at end of file
+Distributed under the **GNU General Public License v3.0**. See [LICENSE](https://github.com/alttester/AltTester-Unity-SDK/blob/master/LICENSE) for more information.
diff --git a/Assets/AltTester/ReadMe.txt b/Assets/AltTester/ReadMe.txt
deleted file mode 100644
index d73307434..000000000
--- a/Assets/AltTester/ReadMe.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# AltTester
-
-The AltTester package contains a AltDriver module 
-that will open a socket connection on the device running the Unity 
-application and will give access to all the objects in the Unity hierarchy. 
-
-Using this socket connection and the actions available in the AltDriver, 
-we can run tests against the Unity app running on iOS or Android. 
-
-# Source code and Documentation
-
-The full source code and documentation for this can be found here:
-https://github.com/alttester/AltTester-Unity-SDK
-
-# Support - Questions and Suggestions
-
-Please email us at: contact@alttester.com
\ No newline at end of file
diff --git a/Assets/AltTester/ReadMe.txt.meta b/Assets/AltTester/ReadMe.txt.meta
deleted file mode 100644
index f87730af8..000000000
--- a/Assets/AltTester/ReadMe.txt.meta
+++ /dev/null
@@ -1,9 +0,0 @@
-fileFormatVersion: 2
-guid: a32a691703ca74f7686f402bfa0d670a
-timeCreated: 1519240273
-licenseType: Pro
-TextScriptImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/AltTester/Runtime.meta b/Assets/AltTester/Runtime.meta
index 1b9c0554e..bd84836b7 100644
--- a/Assets/AltTester/Runtime.meta
+++ b/Assets/AltTester/Runtime.meta
@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: dad12aad268c3e44d846b8fc62419747
+guid: 9f3551d71027f6e4995066f6c46d518f
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
+  userData:
+  assetBundleName:
+  assetBundleVariant:
diff --git a/Assets/AltTester/Runtime/AltDriver/AltDriver.cs b/Assets/AltTester/Runtime/AltDriver/AltDriver.cs
index d75367e36..a6d49a088 100644
--- a/Assets/AltTester/Runtime/AltDriver/AltDriver.cs
+++ b/Assets/AltTester/Runtime/AltDriver/AltDriver.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Threading;
+using AltTester.AltTesterUnitySDK.Driver.Communication;
 using AltTester.AltTesterUnitySDK.Driver.Commands;
 using AltTester.AltTesterUnitySDK.Driver.Logging;
 using AltTester.AltTesterUnitySDK.Driver.Notifications;
@@ -49,7 +50,7 @@ public AltDriver(string host = "127.0.0.1", int port = 13000, bool enableLogging
                 port,
                 appName
             );
-            communicationHandler = new DriverCommunicationWebSocket(host, port, connectTimeout, appName);
+            communicationHandler = new DriverCommunicationHandler(host, port, connectTimeout, appName);
             communicationHandler.Connect();
 
             checkServerVersion();
diff --git a/Assets/AltTester/Runtime/AltDriver/AltErrors.cs b/Assets/AltTester/Runtime/AltDriver/AltErrors.cs
index 3473dbec7..e5ae31997 100644
--- a/Assets/AltTester/Runtime/AltDriver/AltErrors.cs
+++ b/Assets/AltTester/Runtime/AltDriver/AltErrors.cs
@@ -1,6 +1,4 @@
-﻿
-using System;
-using AltTester.AltTesterUnitySDK.Driver.Logging;
+﻿using System;
 
 namespace AltTester.AltTesterUnitySDK.Driver
 {
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/AltCommands/AltResetInput.cs b/Assets/AltTester/Runtime/AltDriver/Commands/AltCommands/AltResetInput.cs
index 9d09b81f1..5e7754ced 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/AltCommands/AltResetInput.cs
+++ b/Assets/AltTester/Runtime/AltDriver/Commands/AltCommands/AltResetInput.cs
@@ -1,3 +1,5 @@
+using AltTester.AltTesterUnitySDK.Driver.Commands;
+
 namespace AltTester.AltTesterUnitySDK.Driver.Commands
 {
     public class AltResetInput : AltBaseCommand
@@ -12,4 +14,4 @@ public void Execute()
             ValidateResponse("Ok", data);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/AltSetStaticProperty.cs b/Assets/AltTester/Runtime/AltDriver/Commands/AltSetStaticProperty.cs
index 6e7407ffb..cc9c50230 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/AltSetStaticProperty.cs
+++ b/Assets/AltTester/Runtime/AltDriver/Commands/AltSetStaticProperty.cs
@@ -1,13 +1,17 @@
+using AltTester.AltTesterUnitySDK.Driver.Commands;
+
 namespace AltTester.AltTesterUnitySDK.Driver.Commands
 {
     public class AltSetStaticProperty : AltBaseCommand
     {
         AltSetObjectComponentPropertyParams cmdParams;
+
         public AltSetStaticProperty(IDriverCommunication commHandler, string componentName, string propertyName, string assemblyName, object newValue) : base(commHandler)
         {
             var strValue = Newtonsoft.Json.JsonConvert.SerializeObject(newValue);
             cmdParams = new AltSetObjectComponentPropertyParams(null, componentName, propertyName, assemblyName, strValue);
         }
+
         public void Execute()
         {
             CommHandler.Send(cmdParams);
@@ -15,4 +19,4 @@ public void Execute()
             ValidateResponse("valueSet", data);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs b/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs
index 41b5f03b5..f8263dc2f 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs
+++ b/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs
@@ -52,4 +52,4 @@ public T Execute()
             throw new WaitTimeOutException("Property " + propertyName + " not loaded after " + timeout + " seconds");
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs.meta b/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs.meta
index 2a78e5451..f9054f9b4 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs.meta
+++ b/Assets/AltTester/Runtime/AltDriver/Commands/FindObjects/AltWaitForComponentProperty.cs.meta
@@ -1,11 +1,11 @@
 fileFormatVersion: 2
-guid: 1c78c01f05862f2498f194eb829b4699
+guid: c8249de1620490949b524fa42bf80b1e
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
   defaultReferences: []
   executionOrder: 0
   icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
+  userData:
+  assetBundleName:
+  assetBundleVariant:
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/Parameters/CommandParams.cs b/Assets/AltTester/Runtime/AltDriver/Commands/Parameters/CommandParams.cs
index 625f45545..3f8bc2a72 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/Parameters/CommandParams.cs
+++ b/Assets/AltTester/Runtime/AltDriver/Commands/Parameters/CommandParams.cs
@@ -2,6 +2,7 @@
 using AltTester.AltTesterUnitySDK.Driver.Logging;
 using AltTester.AltTesterUnitySDK.Driver.Notifications;
 using Newtonsoft.Json;
+
 namespace AltTester.AltTesterUnitySDK.Driver.Commands
 {
     public class CommandParams
@@ -31,12 +32,13 @@ public CommandParams(string commandName, string messageId)
     public class CommandAttribute : Attribute
     {
         private string name;
+
+        public string Name { get { return name; } }
+
         public CommandAttribute(string name)
         {
             this.name = name;
         }
-
-        public string Name { get { return name; } }
     }
 
     public class CommandError
@@ -77,15 +79,14 @@ public class AltFindObjectsParams : BaseFindObjectsParams
     {
         public AltFindObjectsParams(string path, By cameraBy, string cameraPath, bool enabled) : base(path, cameraBy, cameraPath, enabled)
         {
-
         }
     }
+
     [Command("findObject")]
     public class AltFindObjectParams : BaseFindObjectsParams
     {
         public AltFindObjectParams(string path, By cameraBy, string cameraPath, bool enabled) : base(path, cameraBy, cameraPath, enabled)
         {
-
         }
     }
 
@@ -94,9 +95,9 @@ public class AltFindObjectsLightParams : BaseFindObjectsParams
     {
         public AltFindObjectsLightParams(string path, By cameraBy, string cameraPath, bool enabled) : base(path, cameraBy, cameraPath, enabled)
         {
-
         }
     }
+
     [Command("getAllLoadedScenesAndObjects")]
     public class AltGetAllLoadedScenesAndObjectsParams : BaseFindObjectsParams
     {
@@ -167,11 +168,10 @@ public AltPressKeyboardKeysParams(AltKeyCode[] keyCodes, float power, float dura
         }
     }
 
-
     [Command("scroll")]
     public class AltScrollParams : CommandParams
     {
-        public float speed;//TODO change to vector2
+        public float speed; //TODO: Change to AltVector2
         public float speedHorizontal;
         public float duration;
         public bool wait;
@@ -202,7 +202,6 @@ public AltSwipeParams(AltVector2 start, AltVector2 end, float duration, bool wai
         }
     }
 
-
     [Command("tilt")]
     public class AltTiltParams : CommandParams
     {
@@ -217,6 +216,7 @@ public AltTiltParams(AltVector3 acceleration, float duration, bool wait) : base(
             this.wait = wait;
         }
     }
+
     public class BaseAltObjectParams : CommandParams
     {
         public AltObject altObject;
@@ -235,7 +235,6 @@ public class AltCallComponentMethodForObjectParams : BaseAltObjectParams
         public string[] typeOfParameters;
         public string assembly;
 
-
         public AltCallComponentMethodForObjectParams(AltObject altObject, string component, string method, string[] parameters, string[] typeOfParameters, string assembly) : base(altObject)
         {
             this.component = component;
@@ -262,6 +261,7 @@ public AltGetObjectComponentPropertyParams(AltObject altObject, string component
             this.maxDepth = maxDepth;
         }
     }
+
     [Command("setObjectComponentProperty")]
     public class AltSetObjectComponentPropertyParams : BaseAltObjectParams
     {
@@ -279,7 +279,6 @@ public AltSetObjectComponentPropertyParams(AltObject altObject, string component
         }
     }
 
-
     [Command("dragObject")]
     public class AltDragObjectParams : BaseAltObjectParams
     {
@@ -290,6 +289,7 @@ public AltDragObjectParams(AltObject altObject, AltVector2 position) : base(altO
             this.position = position;
         }
     }
+
     [Command("getAllComponents")]
     public class AltGetAllComponentsParams : CommandParams
     {
@@ -314,6 +314,7 @@ public AltGetAllFieldsParams(int altObjectId, AltComponent altComponent, AltFiel
             this.altFieldsSelections = altFieldsSelections;
         }
     }
+
     [Command("getAllProperties")]
     public class AltGetAllPropertiesParams : CommandParams
     {
@@ -328,6 +329,7 @@ public AltGetAllPropertiesParams(int altObjectId, AltComponent altComponent, Alt
             this.altPropertiesSelections = altPropertiesSelections;
         }
     }
+
     [Command("getAllMethods")]
     public class AltGetAllMethodsParams : CommandParams
     {
@@ -340,6 +342,7 @@ public AltGetAllMethodsParams(AltComponent altComponent, AltMethodSelection meth
             this.methodSelection = methodSelection;
         }
     }
+
     [Command("getText")]
     public class AltGetTextParams : BaseAltObjectParams
     {
@@ -348,8 +351,6 @@ public AltGetTextParams(AltObject altObject) : base(altObject)
         }
     }
 
-
-
     [Command("setText")]
     public class AltSetTextParams : BaseAltObjectParams
     {
@@ -378,6 +379,7 @@ public AltPointerEnterObjectParams(AltObject altObject) : base(altObject)
         {
         }
     }
+
     [Command("pointerExitObject")]
     public class AltPointerExitObjectParams : BaseAltObjectParams
     {
@@ -385,6 +387,7 @@ public AltPointerExitObjectParams(AltObject altObject) : base(altObject)
         {
         }
     }
+
     [Command("pointerUpFromObject")]
     public class AltPointerUpFromObjectParams : BaseAltObjectParams
     {
@@ -393,7 +396,6 @@ public AltPointerUpFromObjectParams(AltObject altObject) : base(altObject)
         }
     }
 
-
     [Command("getPNGScreenshot")]
     public class AltGetPNGScreenshotParams : CommandParams
     {
@@ -407,6 +409,7 @@ public class AltGetScreenshotParams : CommandParams
     {
         public AltVector2 size;
         public int quality;
+
         public AltGetScreenshotParams(AltVector2 size, int quality) : base()
         {
             this.size = size;
@@ -422,6 +425,7 @@ public class AltHighlightObjectScreenshotParams : CommandParams
         public float width;
         public AltVector2 size;
         public int quality;
+
         public AltHighlightObjectScreenshotParams(int altObjectId, AltColor color, float width, AltVector2 size, int quality) : base()
         {
             this.altObjectId = altObjectId;
@@ -440,6 +444,7 @@ public class AltHighlightObjectFromCoordinatesScreenshotParams : CommandParams
         public float width;
         public AltVector2 size;
         public int quality;
+
         public AltHighlightObjectFromCoordinatesScreenshotParams(AltVector2 coordinates, AltColor color, float width, AltVector2 size, int quality) : base()
         {
             this.coordinates = coordinates;
@@ -459,12 +464,17 @@ public AltDeleteKeyPlayerPrefParams(string keyName) : base()
             this.keyName = keyName;
         }
     }
+
     [Command("getKeyPlayerPref")]
     public class AltGetKeyPlayerPrefParams : CommandParams
     {
         public string keyName;
         public PlayerPrefKeyType keyType;
-        public AltGetKeyPlayerPrefParams() : base() { }
+
+        public AltGetKeyPlayerPrefParams() : base()
+        {
+        }
+
         public AltGetKeyPlayerPrefParams(string keyName, PlayerPrefKeyType keyType) : base()
         {
             this.keyName = keyName;
@@ -489,12 +499,14 @@ public AltSetKeyPlayerPrefParams(string keyName, int value) : base()
             this.intValue = value;
             keyType = PlayerPrefKeyType.Int;
         }
+
         public AltSetKeyPlayerPrefParams(string keyName, float value) : base()
         {
             this.keyName = keyName;
             this.floatValue = value;
             keyType = PlayerPrefKeyType.Float;
         }
+
         public AltSetKeyPlayerPrefParams(string keyName, string value) : base()
         {
             this.keyName = keyName;
@@ -518,27 +530,27 @@ public AltGetAllActiveCamerasParams() : base()
         {
         }
     }
+
     [Command("getAllCameras")]
     public class AltGetAllCamerasParams : CommandParams
     {
-
     }
 
     [Command("getAllLoadedScenes")]
     public class AltGetAllLoadedScenesParams : CommandParams
     {
-
     }
+
     [Command("getAllScenes")]
     public class AltGetAllScenesParams : CommandParams
     {
-
     }
+
     [Command("getCurrentScene")]
     public class AltGetCurrentSceneParams : CommandParams
     {
-
     }
+
     [Command("loadScene")]
     public class AltLoadSceneParams : CommandParams
     {
@@ -550,7 +562,6 @@ public AltLoadSceneParams(string sceneName, bool loadSingle) : base()
             this.sceneName = sceneName;
             this.loadSingle = loadSingle;
         }
-
     }
 
     [Command("unloadScene")]
@@ -562,22 +573,24 @@ public AltUnloadSceneParams(string sceneName) : base()
         {
             this.sceneName = sceneName;
         }
-
     }
+
     [Command("getTimeScale")]
     public class AltGetTimeScaleParams : CommandParams
     {
-
     }
+
     [Command("setTimeScale")]
     public class AltSetTimeScaleParams : CommandParams
     {
         public float timeScale;
+
         public AltSetTimeScaleParams(float timeScale) : base()
         {
             this.timeScale = timeScale;
         }
     }
+
     [Command("setServerLogging")]
     public class AltSetServerLoggingParams : CommandParams
     {
@@ -597,6 +610,7 @@ public class AltTapElementParams : BaseAltObjectParams
         public int count;
         public float interval;
         public bool wait;
+
         public AltTapElementParams(AltObject altObject, int count, float interval, bool wait) : base(altObject)
         {
             this.count = count;
@@ -611,6 +625,7 @@ public class AltClickElementParams : BaseAltObjectParams
         public int count;
         public float interval;
         public bool wait;
+
         public AltClickElementParams(AltObject altObject, int count, float interval, bool wait) : base(altObject)
         {
             this.count = count;
@@ -626,6 +641,7 @@ public class AltClickCoordinatesParams : CommandParams
         public int count;
         public float interval;
         public bool wait;
+
         public AltClickCoordinatesParams(AltVector2 coordinates, int count, float interval, bool wait)
         {
             this.coordinates = coordinates;
@@ -634,6 +650,7 @@ public AltClickCoordinatesParams(AltVector2 coordinates, int count, float interv
             this.wait = wait;
         }
     }
+
     [Command("tapCoordinates")]
     public class AltTapCoordinatesParams : CommandParams
     {
@@ -641,6 +658,7 @@ public class AltTapCoordinatesParams : CommandParams
         public int count;
         public float interval;
         public bool wait;
+
         public AltTapCoordinatesParams(AltVector2 coordinates, int count, float interval, bool wait)
         {
             this.coordinates = coordinates;
@@ -678,6 +696,7 @@ public AltKeysDownParams(AltKeyCode[] keyCodes, float power)
     public class AltBeginTouchParams : CommandParams
     {
         public AltVector2 coordinates;
+
         public AltBeginTouchParams(AltVector2 coordinates)
         {
             this.coordinates = coordinates;
@@ -689,6 +708,7 @@ public class AltMoveTouchParams : CommandParams
     {
         public int fingerId;
         public AltVector2 coordinates;
+
         public AltMoveTouchParams(int fingerId, AltVector2 coordinates)
         {
             this.coordinates = coordinates;
@@ -700,6 +720,7 @@ public AltMoveTouchParams(int fingerId, AltVector2 coordinates)
     public class AltEndTouchParams : CommandParams
     {
         public int fingerId;
+
         public AltEndTouchParams(int fingerId)
         {
             this.fingerId = fingerId;
@@ -732,6 +753,7 @@ public DeactivateNotification(NotificationType notificationType)
     public class AltFindObjectAtCoordinatesParams : CommandParams
     {
         public AltVector2 coordinates;
+
         public AltFindObjectAtCoordinatesParams(AltVector2 coordinates)
         {
             this.coordinates = coordinates;
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/Screenshot/AltGetPNGScreenshot.cs b/Assets/AltTester/Runtime/AltDriver/Commands/Screenshot/AltGetPNGScreenshot.cs
index 2b1568f5d..6008aed2c 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/Screenshot/AltGetPNGScreenshot.cs
+++ b/Assets/AltTester/Runtime/AltDriver/Commands/Screenshot/AltGetPNGScreenshot.cs
@@ -4,11 +4,13 @@ public class AltGetPNGScreenshot : AltBaseCommand
     {
         string path;
         AltGetPNGScreenshotParams cmdParams;
+
         public AltGetPNGScreenshot(IDriverCommunication commHandler, string path) : base(commHandler)
         {
             this.path = path;
             this.cmdParams = new AltGetPNGScreenshotParams();
         }
+
         public void Execute()
         {
             CommHandler.Send(cmdParams);
@@ -18,4 +20,4 @@ public void Execute()
             System.IO.File.WriteAllBytes(path, System.Convert.FromBase64String(screenshotData));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/3rdParty/nlog.4.7.9/package.meta b/Assets/AltTester/Runtime/AltDriver/Communication.meta
similarity index 77%
rename from Assets/AltTester/Runtime/3rdParty/nlog.4.7.9/package.meta
rename to Assets/AltTester/Runtime/AltDriver/Communication.meta
index 04f99cf78..e9893a6e0 100644
--- a/Assets/AltTester/Runtime/3rdParty/nlog.4.7.9/package.meta
+++ b/Assets/AltTester/Runtime/AltDriver/Communication.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 78c53d24ad02d5b4fbb7a3dc102796ce
+guid: 783070ce1051949e5b0896aae6e2fd33
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/DriverCommunicationWebSocket.cs b/Assets/AltTester/Runtime/AltDriver/Communication/DriverCommunicationHandler.cs
similarity index 76%
rename from Assets/AltTester/Runtime/AltDriver/Commands/DriverCommunicationWebSocket.cs
rename to Assets/AltTester/Runtime/AltDriver/Communication/DriverCommunicationHandler.cs
index d09f95f74..6c4815219 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/DriverCommunicationWebSocket.cs
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/DriverCommunicationHandler.cs
@@ -3,24 +3,24 @@
 using System.Diagnostics;
 using System.Globalization;
 using System.Threading;
+using AltTester.AltTesterUnitySDK.Driver.Commands;
 using AltTester.AltTesterUnitySDK.Driver.Logging;
 using AltTester.AltTesterUnitySDK.Driver.Notifications;
 using AltWebSocketSharp;
 using Newtonsoft.Json;
 
-namespace AltTester.AltTesterUnitySDK.Driver.Commands
+namespace AltTester.AltTesterUnitySDK.Driver.Communication
 {
-    public class DriverCommunicationWebSocket : IDriverCommunication
+    public class DriverCommunicationHandler : IDriverCommunication
     {
         private static readonly NLog.Logger logger = DriverLogManager.Instance.GetCurrentClassLogger();
 
-        private WebSocket wsClient = null;
+        private DriverWebSocketClient wsClient = null;
 
-        private readonly string _host;
-        private readonly int _port;
-        private readonly string _uri;
-        private readonly string _appName;
-        private readonly int _connectTimeout;
+        private readonly string host;
+        private readonly int port;
+        private readonly string appName;
+        private readonly int connectTimeout;
 
         private int commandTimeout = 60;
         private float delayAfterCommand = 0;
@@ -28,84 +28,42 @@ public class DriverCommunicationWebSocket : IDriverCommunication
         private Queue<CommandResponse> messages;
         private List<string> messageIdTimeouts = new List<string>();
 
-        private String error = null;
-
-        private int closeCode = 0;
-        private String closeReason = null;
-
         private List<Action<AltLoadSceneNotificationResultParams>> loadSceneCallbacks = new List<Action<AltLoadSceneNotificationResultParams>>();
         private List<Action<String>> unloadSceneCallbacks = new List<Action<String>>();
         private List<Action<AltLogNotificationResultParams>> logCallbacks = new List<Action<AltLogNotificationResultParams>>();
         private List<Action<bool>> applicationPausedCallbacks = new List<Action<bool>>();
 
-        public DriverCommunicationWebSocket(string host, int port, int connectTimeout, string appName)
+        public DriverCommunicationHandler(string host, int port, int connectTimeout, string appName)
         {
-            _host = host;
-            _port = port;
-            _appName = appName;
+            this.host = host;
+            this.port = port;
+            this.appName = appName;
+            this.connectTimeout = connectTimeout;
 
-            _uri = "ws://" + host + ":" + port + "/altws?appName=" + Uri.EscapeUriString(appName);
-            _connectTimeout = connectTimeout;
-
-            messages = new Queue<CommandResponse>();
+            this.messages = new Queue<CommandResponse>();
         }
 
         public void Connect()
         {
-            logger.Info("Connecting to: '{0}'.", _uri);
-
-            int delay = 100;
-
-            this.wsClient = new WebSocket(_uri);
-            this.wsClient.OnError += OnError;
-            this.wsClient.OnClose += OnClose;
+            this.wsClient = new DriverWebSocketClient(this.host, this.port, "/altws", this.appName, this.connectTimeout);
             this.wsClient.OnMessage += (sender, e) =>
             {
                 OnMessage(sender, e.Data);
             };
 
-            Stopwatch watch = Stopwatch.StartNew();
-            int retries = 0;
-
-            while (_connectTimeout > watch.Elapsed.TotalSeconds)
-            {
-                if (retries > 0)
-                {
-                    logger.Debug(string.Format("Retrying #{0} to connect to: '{1}'.", retries, _uri));
-                }
-                wsClient.Connect();
-
-                if (wsClient.IsAlive)
-                {
-                    break;
-                }
-
-                retries++;
-                Thread.Sleep(delay); // Delay between retries.
-            }
-
-            this.CheckCloseMessage();
-            this.CheckError();
-
-            if (watch.Elapsed.TotalSeconds > _connectTimeout && !wsClient.IsAlive)
-            {
-                throw new ConnectionTimeoutException(string.Format("Failed to connect to AltTester on host: {0} port: {1}.", _host, _port));
-            }
-
-            logger.Debug("Connected to: " + _uri);
+            this.wsClient.Connect();
         }
 
         public T Recvall<T>(CommandParams param)
         {
             Stopwatch watch = Stopwatch.StartNew();
             while (true)
-
             {
-
                 while (messages.Count == 0 && wsClient.IsAlive && commandTimeout >= watch.Elapsed.TotalSeconds)
                 {
                     Thread.Sleep(10);
                 }
+
                 if (commandTimeout < watch.Elapsed.TotalSeconds && wsClient.IsAlive)
                 {
                     messageIdTimeouts.Add(param.messageId);
@@ -153,39 +111,15 @@ public void Send(CommandParams param)
                 Culture = CultureInfo.InvariantCulture
             });
             this.wsClient.Send(message);
-            logger.Debug("command sent: " + trimLog(message));
+            logger.Debug("Command sent: " + Utils.TrimLog(message));
         }
 
         public void Close()
         {
-            logger.Info(string.Format("Closing connection to AltTester on: {0}", _uri));
+            logger.Info(string.Format("Closing connection to AltTester on: {0}", this.wsClient.URI));
             this.wsClient.Close();
         }
 
-        private void CheckCloseMessage()
-        {
-            if (this.closeCode != 0 && this.closeReason != null)
-            {
-                if (this.closeCode == 4001)
-                {
-                    throw new NoAppConnectedException(this.closeReason);
-                }
-
-                if (this.closeCode == 4002)
-                {
-                    throw new AppDisconnectedException(this.closeReason);
-                }
-            }
-        }
-
-        private void CheckError()
-        {
-            if (this.error != null)
-            {
-                throw new ConnectionException(this.error);
-            }
-        }
-
         public void SetCommandTimeout(int timeout)
         {
             commandTimeout = timeout;
@@ -202,32 +136,14 @@ protected void OnMessage(object sender, string data)
             else
             {
                 messages.Enqueue(message);
-                logger.Debug("response received: " + trimLog(data));
-            }
-        }
-
-        protected void OnError(object sender, AltWebSocketSharp.ErrorEventArgs e)
-        {
-            logger.Error(e.Message);
-            if (e.Exception != null)
-            {
-                logger.Error(e.Exception);
+                logger.Debug("Response received: " + Utils.TrimLog(data));
             }
-
-            this.error = e.Message;
-        }
-
-        protected void OnClose(object sender, CloseEventArgs e)
-        {
-            logger.Debug("Connection to AltTester closed: [Code:{0}, Reason:{1}]", e.Code, e.Reason);
-
-            this.closeCode = e.Code;
-            this.closeReason = e.Reason;
         }
 
         private void handleNotification(CommandResponse message)
         {
             handleErrors(message.error);
+
             switch (message.commandName)
             {
                 case "loadSceneNotification":
@@ -317,13 +233,6 @@ private void handleErrors(CommandError error)
             throw new UnknownErrorException(error.message);
         }
 
-        private string trimLog(string log, int maxLogLength = 1000)
-        {
-            if (string.IsNullOrEmpty(log)) return log;
-            if (log.Length <= maxLogLength) return log;
-            return log.Substring(0, maxLogLength) + "[...]";
-        }
-
         public void AddNotificationListener<T>(NotificationType notificationType, Action<T> callback, bool overwrite)
         {
             switch (notificationType)
@@ -398,7 +307,7 @@ public float GetDelayAfterCommand()
 
         public void SleepFor(float time)
         {
-            Thread.Sleep(System.Convert.ToInt32(time * 1000));
+            Utils.SleepFor(time);
         }
     }
 }
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/DriverCommunicationWebSocket.cs.meta b/Assets/AltTester/Runtime/AltDriver/Communication/DriverCommunicationHandler.cs.meta
similarity index 83%
rename from Assets/AltTester/Runtime/AltDriver/Commands/DriverCommunicationWebSocket.cs.meta
rename to Assets/AltTester/Runtime/AltDriver/Communication/DriverCommunicationHandler.cs.meta
index 01f9f9177..a69d82f3c 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/DriverCommunicationWebSocket.cs.meta
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/DriverCommunicationHandler.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 235f9b870d54e4740b727a53ed77f361
+guid: ab14d7c91e3d1492e9128015df5fcd4b
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/AltTester/Runtime/AltDriver/Communication/DriverWebSocketClient.cs b/Assets/AltTester/Runtime/AltDriver/Communication/DriverWebSocketClient.cs
new file mode 100644
index 000000000..6f48837a9
--- /dev/null
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/DriverWebSocketClient.cs
@@ -0,0 +1,140 @@
+using System;
+using System.Threading;
+using System.Diagnostics;
+using AltWebSocketSharp;
+using AltTester.AltTesterUnitySDK.Driver;
+using AltTester.AltTesterUnitySDK.Driver.Logging;
+
+namespace AltTester.AltTesterUnitySDK.Driver.Communication {
+    public class DriverWebSocketClient
+    {
+        private static readonly NLog.Logger logger = DriverLogManager.Instance.GetCurrentClassLogger();
+
+        private readonly string host;
+        private readonly int port;
+        private readonly string uri;
+        private readonly string appName;
+        private readonly int connectTimeout;
+
+        private String error = null;
+
+        private int closeCode = 0;
+        private String closeReason = null;
+
+        private WebSocket wsClient = null;
+        public event EventHandler<MessageEventArgs> OnMessage;
+
+        public bool IsAlive { get { return this.wsClient != null && this.wsClient.IsAlive; } }
+        public string URI { get { return this.uri; } }
+
+        public DriverWebSocketClient(string host, int port, string path, string appName, int connectTimeout)
+        {
+            this.host = host;
+            this.port = port;
+            this.appName = appName;
+            this.connectTimeout = connectTimeout;
+
+            this.uri = Utils.CreateURI(host, port, path, appName).ToString();
+        }
+
+        private void CheckCloseMessage()
+        {
+            if (this.closeCode != 0 && this.closeReason != null)
+            {
+                if (this.closeCode == 4001)
+                {
+                    throw new NoAppConnectedException(this.closeReason);
+                }
+
+                if (this.closeCode == 4002)
+                {
+                    throw new AppDisconnectedException(this.closeReason);
+                }
+            }
+        }
+
+        private void CheckError()
+        {
+            if (this.error != null)
+            {
+                throw new ConnectionException(this.error);
+            }
+        }
+
+        protected void OnError(object sender, AltWebSocketSharp.ErrorEventArgs e)
+        {
+            logger.Error(e.Message);
+            if (e.Exception != null)
+            {
+                logger.Error(e.Exception);
+            }
+
+            this.error = e.Message;
+        }
+
+        protected void OnClose(object sender, CloseEventArgs e)
+        {
+            logger.Debug("Connection to AltTester closed: [Code:{0}, Reason:{1}].", e.Code, e.Reason);
+
+            this.closeCode = e.Code;
+            this.closeReason = e.Reason;
+        }
+
+        public void Connect()
+        {
+            logger.Info("Connecting to: '{0}'.", this.uri);
+
+            int delay = 100;
+
+            this.wsClient = new WebSocket(this.uri);
+            this.wsClient.OnError += OnError;
+            this.wsClient.OnClose += OnClose;
+            this.wsClient.OnMessage += (sender, message) => this.OnMessage.Invoke(this, message);
+
+            Stopwatch watch = Stopwatch.StartNew();
+            int retries = 0;
+
+            while (this.connectTimeout > watch.Elapsed.TotalSeconds)
+            {
+                if (retries > 0)
+                {
+                    logger.Debug(string.Format("Retrying #{0} to connect to: '{1}'.", retries, this.uri));
+                }
+                wsClient.Connect();
+
+                if (wsClient.IsAlive)
+                {
+                    break;
+                }
+
+                retries++;
+                Thread.Sleep(delay); // Delay between retries.
+            }
+
+            this.CheckCloseMessage();
+            this.CheckError();
+
+            if (watch.Elapsed.TotalSeconds > this.connectTimeout && !wsClient.IsAlive)
+            {
+                throw new ConnectionTimeoutException(string.Format("Failed to connect to AltServer on host: {0} port: {1}.", this.host, this.port));
+            }
+
+            logger.Debug(string.Format("Connected to: '{0}'.", this.uri));
+        }
+
+        public void Close()
+        {
+            logger.Info(string.Format("Closing connection to AltServer on: '{0}'.", this.uri));
+            this.wsClient.Close();
+        }
+
+        public void Send(string message) {
+            if (!this.IsAlive) {
+                logger.Warn("The connection is already closed.");
+                return;
+            }
+
+            this.wsClient.Send(message);
+        }
+    }
+}
diff --git a/Assets/AltTester/Runtime/Communication/AltWebGLWebSocketHandler.cs.meta b/Assets/AltTester/Runtime/AltDriver/Communication/DriverWebSocketClient.cs.meta
similarity index 83%
rename from Assets/AltTester/Runtime/Communication/AltWebGLWebSocketHandler.cs.meta
rename to Assets/AltTester/Runtime/AltDriver/Communication/DriverWebSocketClient.cs.meta
index 66bfcca1e..2489eec10 100644
--- a/Assets/AltTester/Runtime/Communication/AltWebGLWebSocketHandler.cs.meta
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/DriverWebSocketClient.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: f21f2dbb53f358e4fa8d62300c0a353a
+guid: a55337c82961c4d2b958e866037fea94
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/IDriverCommunication.cs b/Assets/AltTester/Runtime/AltDriver/Communication/IDriverCommunication.cs
similarity index 100%
rename from Assets/AltTester/Runtime/AltDriver/Commands/IDriverCommunication.cs
rename to Assets/AltTester/Runtime/AltDriver/Communication/IDriverCommunication.cs
diff --git a/Assets/AltTester/Runtime/AltDriver/Commands/IDriverCommunication.cs.meta b/Assets/AltTester/Runtime/AltDriver/Communication/IDriverCommunication.cs.meta
similarity index 83%
rename from Assets/AltTester/Runtime/AltDriver/Commands/IDriverCommunication.cs.meta
rename to Assets/AltTester/Runtime/AltDriver/Communication/IDriverCommunication.cs.meta
index 2cf32b157..f62ef54ab 100644
--- a/Assets/AltTester/Runtime/AltDriver/Commands/IDriverCommunication.cs.meta
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/IDriverCommunication.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 168830f4a2e963c4b9bbd7c80808d3d2
+guid: 14340a274d45041cfad7c0ba43c90471
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/AltTester/Runtime/AltDriver/Communication/LiveUpdateDriver.cs b/Assets/AltTester/Runtime/AltDriver/Communication/LiveUpdateDriver.cs
new file mode 100644
index 000000000..6e9a544e9
--- /dev/null
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/LiveUpdateDriver.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.Threading;
+using AltTester.AltTesterUnitySDK.Driver.Logging;
+using Newtonsoft.Json;
+
+namespace AltTester.AltTesterUnitySDK.Driver.Communication {
+    public class LiveUpdateDriver
+    {
+        private static readonly NLog.Logger logger = DriverLogManager.Instance.GetCurrentClassLogger();
+
+        private DriverWebSocketClient wsClient = null;
+
+        public event EventHandler<byte[]> OnMessage;
+
+        private bool isRunning = false;
+
+        public bool IsRunning { get { return this.isRunning; } }
+        public bool IsAlive { get { return this.wsClient != null && this.wsClient.IsAlive; } }
+
+        public void Connect(string host, int port, string appName, int connectTimeout)
+        {
+            this.isRunning = false;
+            this.wsClient = new DriverWebSocketClient(host, port, "/altws/live-update", appName, connectTimeout);
+            this.wsClient.OnMessage += (sender, e) =>
+            {
+                this.OnMessage.Invoke(this, e.RawData);
+            };
+            this.wsClient.Connect();
+        }
+
+        public void Close()
+        {
+            logger.Info(string.Format("Closing connection to AltTester on: '{0}'.", this.wsClient.URI));
+
+            this.isRunning = false;
+            this.wsClient.Close();
+        }
+
+        public void Start()
+        {
+            this.wsClient.Send("Start");
+            this.isRunning = true;
+        }
+
+        public void Stop()
+        {
+            this.wsClient.Send("Stop");
+            this.isRunning = false;
+        }
+
+        public void UpdateFrameRate(int frameRate)
+        {
+            this.wsClient.Send(string.Format("FrameRate:{0}", frameRate));
+        }
+
+        public void UpdateQuality(int quality)
+        {
+            this.wsClient.Send(string.Format("Quality:{0}", quality));
+        }
+    }
+}
diff --git a/Assets/AltTester/Runtime/Communication/BaseWebSocketHandler.cs.meta b/Assets/AltTester/Runtime/AltDriver/Communication/LiveUpdateDriver.cs.meta
similarity index 83%
rename from Assets/AltTester/Runtime/Communication/BaseWebSocketHandler.cs.meta
rename to Assets/AltTester/Runtime/AltDriver/Communication/LiveUpdateDriver.cs.meta
index 18b28330e..c0b97b593 100644
--- a/Assets/AltTester/Runtime/Communication/BaseWebSocketHandler.cs.meta
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/LiveUpdateDriver.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 0b2b6670ad51fdb45af13b9156e2f24b
+guid: 09fdd6df051f140d3a078418b423d84e
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/AltTester/Runtime/AltDriver/Communication/Utils.cs b/Assets/AltTester/Runtime/AltDriver/Communication/Utils.cs
new file mode 100644
index 000000000..37ee51f49
--- /dev/null
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/Utils.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Threading;
+
+namespace AltTester.AltTesterUnitySDK.Driver.Communication {
+    public class Utils
+    {
+        public static Uri CreateURI(string host, int port, string path, string appName)
+        {
+            Uri uri;
+            if (!Uri.TryCreate(string.Format("ws://{0}:{1}{2}?appName={3}", host, port, path, appName), UriKind.Absolute, out uri))
+            {
+                throw new Exception(String.Format("Invalid host or port {0}:{1}", host, port));
+            }
+
+            return uri;
+        }
+
+        public static void SleepFor(float time)
+        {
+            Thread.Sleep(System.Convert.ToInt32(time * 1000));
+        }
+
+        public static string TrimLog(string log, int maxLogLength = 1000)
+        {
+            if (string.IsNullOrEmpty(log))
+            {
+                return log;
+            }
+
+            if (log.Length <= maxLogLength)
+            {
+                return log;
+            }
+
+            return log.Substring(0, maxLogLength) + "[...]";
+        }
+    }
+}
diff --git a/Assets/AltTester/Runtime/Communication/AltClientWebSocketHandler.cs.meta b/Assets/AltTester/Runtime/AltDriver/Communication/Utils.cs.meta
similarity index 83%
rename from Assets/AltTester/Runtime/Communication/AltClientWebSocketHandler.cs.meta
rename to Assets/AltTester/Runtime/AltDriver/Communication/Utils.cs.meta
index 41607190d..35cca4b1e 100644
--- a/Assets/AltTester/Runtime/Communication/AltClientWebSocketHandler.cs.meta
+++ b/Assets/AltTester/Runtime/AltDriver/Communication/Utils.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: c8249de1620490949b524fa42bf80b1e
+guid: c22ac1cc9e1a442e0b283b3d62280a3d
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/AltTester/Runtime/AltId.cs b/Assets/AltTester/Runtime/AltId.cs
index ff7192fd2..86202f3bd 100644
--- a/Assets/AltTester/Runtime/AltId.cs
+++ b/Assets/AltTester/Runtime/AltId.cs
@@ -5,12 +5,14 @@ namespace AltTester.AltTesterUnitySDK
     [DisallowMultipleComponent]
     public class AltId : MonoBehaviour
     {
-
         public string altID;
+
         protected void OnValidate()
         {
             if (altID == null)
+            {
                 altID = System.Guid.NewGuid().ToString();
+            }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/AltInstrumentationSettings.cs b/Assets/AltTester/Runtime/AltInstrumentationSettings.cs
index 76cc86542..a4e4d8cca 100644
--- a/Assets/AltTester/Runtime/AltInstrumentationSettings.cs
+++ b/Assets/AltTester/Runtime/AltInstrumentationSettings.cs
@@ -3,32 +3,34 @@
 namespace AltTester.AltTesterUnitySDK
 {
     /// <summary>
-    /// Unity App Instrumentation settings for AltTester
+    /// Settings for AltTester Unity App instrumentation.
     /// </summary>
     [Serializable]
     public class AltInstrumentationSettings
     {
         /// <summary>
-        /// The host to which the Instrumented Unity App will connect to.
+        /// Gets or sets the host that the instrumented Unity App will connect to.
         /// </summary>
         public string AltServerHost = "127.0.0.1";
 
         /// <summary>
-        /// The port to which the Instrumented Unity App will connect to.
+        /// Gets or sets the port that the instrumented Unity App will connect to.
         /// </summary>
         public int AltServerPort = 13000;
 
+        /// <summary>
+        /// Gets or sets the name of the app that the instrumented Unity App will use as a unique identifier.
+        /// </summary>
         public string AppName = "__default__";
 
         /// <summary>
-        /// If true, it will show where an action happens on screen (e.g. swipe or click).
+        /// Gets or sets a value indicating whether to show where an action happens on the screen (e.g. swipe or click).
         /// </summary>
         public bool InputVisualizer = true;
 
         /// <summary>
-        /// If true, it will display the `AltTester` popup in Instrumented Unity App.
+        /// Gets or sets a value indicating whether to display the AltTester popup in the instrumented Unity App.
         /// </summary>
         public bool ShowPopUp = true;
-
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/Commands/Screenshot/AltBaseScreenshotCommand.cs b/Assets/AltTester/Runtime/Commands/Screenshot/AltBaseScreenshotCommand.cs
index ca64df430..080a5d1be 100644
--- a/Assets/AltTester/Runtime/Commands/Screenshot/AltBaseScreenshotCommand.cs
+++ b/Assets/AltTester/Runtime/Commands/Screenshot/AltBaseScreenshotCommand.cs
@@ -22,7 +22,6 @@ protected AltBaseScreenshotCommand(ICommandHandler handler, TParams cmdParams) :
 
         public abstract override TResult Execute();
 
-
         protected System.Collections.IEnumerator SendTexturedScreenshotCoroutine(UnityEngine.Vector2 size, int quality)
         {
             yield return new UnityEngine.WaitForEndOfFrame();
@@ -88,14 +87,12 @@ private void sendTexturedScreenshotResponse(UnityEngine.Vector2 size, int qualit
             });
 
             Handler.Send(data);
-
         }
 
         private AltGetScreenshotResponse getTexturedScreenshot(UnityEngine.Vector2 size, int quality)
         {
             var screenshot = UnityEngine.ScreenCapture.CaptureScreenshotAsTexture();
             AltGetScreenshotResponse response = new AltGetScreenshotResponse();
-
             response.scaleDifference = new AltVector2(screenshot.width, screenshot.height);
             var screenshotSerialized = UnityEngine.ImageConversion.EncodeToJPG(screenshot, quality);
             response.textureSize = new AltVector3(screenshot.width, screenshot.height);
@@ -107,7 +104,6 @@ private AltGetScreenshotResponse getTexturedScreenshot(UnityEngine.Vector2 size,
 
         private string getPNGScreenshot()
         {
-
             var screenShot = new UnityEngine.Texture2D(UnityEngine.Screen.width, UnityEngine.Screen.height, UnityEngine.TextureFormat.RGB24, false);
             screenShot.ReadPixels(new UnityEngine.Rect(0, 0, UnityEngine.Screen.width, UnityEngine.Screen.height), 0, 0);
             screenShot.Apply();
diff --git a/Assets/AltTester/Runtime/Communication/AltClientWebSocketHandler.cs b/Assets/AltTester/Runtime/Communication/AltClientWebSocketHandler.cs
deleted file mode 100644
index 3094335b7..000000000
--- a/Assets/AltTester/Runtime/Communication/AltClientWebSocketHandler.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using AltWebSocketSharp;
-using UnityEngine.Playables;
-
-namespace AltTester.AltTesterUnitySDK.Communication
-{
-    public class AltClientWebSocketHandler : BaseWebSocketHandler
-    {
-        private readonly WebSocket _webSocket;
-
-        public AltClientWebSocketHandler(WebSocket webSocket, ICommandHandler commandHandler) : base(commandHandler)
-        {
-            this._webSocket = webSocket;
-            webSocket.OnMessage += this.onMessage;
-
-            this._commandHandler.OnSendMessage += webSocket.Send;
-        }
-
-        private void onMessage(object sender, MessageEventArgs message)
-        {
-            this._commandHandler.OnMessage(message.Data);
-        }
-    }
-}
\ No newline at end of file
diff --git a/Assets/AltTester/Runtime/Communication/AltWebGLWebSocketHandler.cs b/Assets/AltTester/Runtime/Communication/AltWebGLWebSocketHandler.cs
deleted file mode 100644
index 18593d95d..000000000
--- a/Assets/AltTester/Runtime/Communication/AltWebGLWebSocketHandler.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System.Text;
-
-namespace AltTester.AltTesterUnitySDK.Communication
-{
-#if UNITY_WEBGL
-    public class AltWebGLWebSocketHandler : BaseWebSocketHandler
-    {
-        protected readonly WebGLWebSocket _webSocket;
-
-        public AltWebGLWebSocketHandler(ICommandHandler cmdHandler, WebGLWebSocket webSocket) : base(cmdHandler)
-        {
-            this._webSocket = webSocket;
-            this._webSocket.OnMessage += this.onMessage;
-
-            _commandHandler.OnSendMessage += (message) =>
-            {
-                this._webSocket.SendText(message).ConfigureAwait(false).GetAwaiter().GetResult();
-            };
-        }
-
-        private void onMessage(byte[] data)
-        {
-            var message = Encoding.UTF8.GetString(data);
-            this._commandHandler.OnMessage(message);
-        }
-    }
-#endif
-}
diff --git a/Assets/AltTester/Runtime/Communication/BaseWebSocketHandler.cs b/Assets/AltTester/Runtime/Communication/BaseWebSocketHandler.cs
deleted file mode 100644
index c07319063..000000000
--- a/Assets/AltTester/Runtime/Communication/BaseWebSocketHandler.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace AltTester.AltTesterUnitySDK.Communication
-{
-    public class BaseWebSocketHandler
-    {
-        protected readonly ICommandHandler _commandHandler;
-
-        public BaseWebSocketHandler(ICommandHandler commandHandler)
-        {
-            _commandHandler = commandHandler;
-        }
-    }
-}
diff --git a/Assets/AltTester/Runtime/Communication/CommandHandler.cs b/Assets/AltTester/Runtime/Communication/CommandHandler.cs
index df9814b31..b38ac663a 100644
--- a/Assets/AltTester/Runtime/Communication/CommandHandler.cs
+++ b/Assets/AltTester/Runtime/Communication/CommandHandler.cs
@@ -3,9 +3,11 @@
 using System.Linq;
 using System.Reflection;
 using AltTester.AltTesterUnitySDK.Commands;
+using AltTester.AltTesterUnitySDK.Communication;
+using AltTester.AltTesterUnitySDK.Logging;
 using AltTester.AltTesterUnitySDK.Driver;
 using AltTester.AltTesterUnitySDK.Driver.Commands;
-using AltTester.AltTesterUnitySDK.Logging;
+using AltTester.AltTesterUnitySDK.Driver.Communication;
 using Newtonsoft.Json;
 
 namespace AltTester.AltTesterUnitySDK.Communication
@@ -15,27 +17,27 @@ public class CommandHandler : ICommandHandler
         private static readonly NLog.Logger logger = ServerLogManager.Instance.GetCurrentClassLogger();
         private static readonly JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings { Culture = CultureInfo.InvariantCulture };
 
-        public CommandHandler()
-        {
-        }
-
         public SendMessageHandler OnSendMessage { get; set; }
 
         public NotificationHandler OnDriverConnect { get; set; }
         public NotificationHandler OnDriverDisconnect { get; set; }
 
+        public CommandHandler()
+        {
+        }
+
         public void Send(string data)
         {
             if (this.OnSendMessage != null)
             {
                 this.OnSendMessage.Invoke(data);
-                logger.Debug(string.Format("response sent: {0}", trimLog(data)));
+                logger.Debug(string.Format("response sent: {0}", Utils.TrimLog(data)));
             }
         }
 
         public void OnMessage(string data)
         {
-            logger.Debug(string.Format("command received: {0}", trimLog(data)));
+            logger.Debug(string.Format("command received: {0}", Utils.TrimLog(data)));
 
             Func<string> executeAndSerialize = null;
             CommandParams cmdParams = null;
@@ -354,25 +356,10 @@ private Type getCommandType(string commandName)
 
             if (type == null)
             {
-                throw new CommandNotFoundException(string.Format("Command `{0}` not found", commandName));
+                throw new CommandNotFoundException(string.Format("Command `{0}` not found.", commandName));
             }
 
             return type;
         }
-
-        private string trimLog(string log, int maxLogLength = 1000)
-        {
-            if (string.IsNullOrEmpty(log))
-            {
-                return log;
-            }
-
-            if (log.Length <= maxLogLength)
-            {
-                return log;
-            }
-
-            return log.Substring(0, maxLogLength) + "[...]";
-        }
     }
 }
diff --git a/Assets/AltTester/Runtime/Communication/ICommandHandler.cs b/Assets/AltTester/Runtime/Communication/ICommandHandler.cs
index 221f339e8..665ba6814 100644
--- a/Assets/AltTester/Runtime/Communication/ICommandHandler.cs
+++ b/Assets/AltTester/Runtime/Communication/ICommandHandler.cs
@@ -1,5 +1,6 @@
 namespace AltTester.AltTesterUnitySDK.Communication
 {
+    public delegate void SendMessageHandler(string message);
     public delegate void NotificationHandler(string driverId);
 
     public interface ICommandHandler
diff --git a/Assets/AltTester/Runtime/Communication/ICommunication.cs b/Assets/AltTester/Runtime/Communication/ICommunication.cs
deleted file mode 100644
index a5032a604..000000000
--- a/Assets/AltTester/Runtime/Communication/ICommunication.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-
-namespace AltTester.AltTesterUnitySDK.Communication
-{
-    public delegate void SendMessageHandler(string message);
-    public delegate void CommunicationHandler();
-    public delegate void CommunicationErrorHandler(string message, Exception error);
-
-    public interface ICommunication
-    {
-        CommunicationHandler OnConnect { get; set; }
-        CommunicationHandler OnDisconnect { get; set; }
-        CommunicationErrorHandler OnError { get; set; }
-        bool IsConnected { get; }
-        bool IsListening { get; }
-        void Start();
-        void Stop();
-    }
-
-    public class UnhandledStartCommError : Exception
-    {
-        public UnhandledStartCommError(string message, Exception innerException) : base(message, innerException)
-        {
-        }
-    }
-
-    public class AddressInUseCommError : Exception
-    {
-        public AddressInUseCommError(string message) : base(message)
-        {
-        }
-    }
-}
diff --git a/Assets/AltTester/Runtime/Communication/ICommunication.cs.meta b/Assets/AltTester/Runtime/Communication/ICommunication.cs.meta
deleted file mode 100644
index ecb29c4ba..000000000
--- a/Assets/AltTester/Runtime/Communication/ICommunication.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 2c99f21e7167b884c8c2f39b0d021fa1
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/AltTester/Runtime/Communication/IRuntimeWebSocketClient.cs b/Assets/AltTester/Runtime/Communication/IRuntimeWebSocketClient.cs
new file mode 100644
index 000000000..8caae1dea
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/IRuntimeWebSocketClient.cs
@@ -0,0 +1,28 @@
+using System;
+
+namespace AltTester.AltTesterUnitySDK.Communication
+{
+    public delegate void CommunicationHandler();
+    public delegate void CommunicationErrorHandler(string message, Exception error);
+    public delegate void CommunicationMessageHandler(string message);
+
+    public interface IRuntimeWebSocketClient
+    {
+        CommunicationHandler OnConnect { get; set; }
+        CommunicationHandler OnDisconnect { get; set; }
+        CommunicationErrorHandler OnError { get; set; }
+        CommunicationMessageHandler OnMessage { get; set; }
+        bool IsConnected { get; }
+        void Connect();
+        void Close();
+        void Send(string message);
+        void Send(byte[] message);
+    }
+
+    public class RuntimeWebSocketClientException : Exception
+    {
+        public RuntimeWebSocketClientException(string message, Exception innerException) : base(message, innerException)
+        {
+        }
+    }
+}
diff --git a/Assets/AltTester/Runtime/Communication/IRuntimeWebSocketClient.cs.meta b/Assets/AltTester/Runtime/Communication/IRuntimeWebSocketClient.cs.meta
new file mode 100644
index 000000000..c008d478e
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/IRuntimeWebSocketClient.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c85f2ecfd56744399a48f2eda9e7a12e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/AltTester/Runtime/Communication/LiveUpdateCommunicationHandler.cs b/Assets/AltTester/Runtime/Communication/LiveUpdateCommunicationHandler.cs
new file mode 100644
index 000000000..11f32378b
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/LiveUpdateCommunicationHandler.cs
@@ -0,0 +1,111 @@
+using AltWebSocketSharp;
+using UnityEngine;
+
+namespace AltTester.AltTesterUnitySDK.Communication
+{
+    public class LiveUpdateCommunicationHandler
+    {
+        private IRuntimeWebSocketClient wsClient = null;
+
+        private readonly string host;
+        private readonly int port;
+        private readonly string appName;
+        private readonly string path = "/altws/live-update/app";
+
+        public CommunicationHandler OnConnect { get; set; }
+        public CommunicationHandler OnDisconnect { get; set; }
+        public CommunicationErrorHandler OnError { get; set; }
+
+        private bool isRunning = false;
+        private int quality = 75;
+        private int frameRate = 10;
+
+        public bool IsConnected { get { return this.wsClient != null && this.wsClient.IsConnected; } }
+        public bool IsRunning { get { return this.isRunning; } }
+        public int Quality { get { return this.quality; } }
+        public int FrameRate { get { return this.frameRate; } }
+
+        public LiveUpdateCommunicationHandler(string host, int port, string appName)
+        {
+            this.host = host;
+            this.port = port;
+            this.appName = appName;
+        }
+
+        public void Connect()
+        {
+            #if UNITY_WEBGL
+                this.wsClient = new WebGLRuntimeWebSocketClient(this.host, this.port, this.path, this.appName);
+            #else
+                this.wsClient = new RuntimeWebSocketClient(this.host, this.port, this.path, this.appName);
+            #endif
+
+            this.wsClient.OnConnect += () =>
+            {
+                if (this.OnConnect != null) this.OnConnect();
+            };
+
+            this.wsClient.OnDisconnect += () =>
+            {
+                if (this.OnDisconnect != null) this.OnDisconnect();
+            };
+
+            this.wsClient.OnError += (message, exception) =>
+            {
+                if (this.OnError != null) this.OnError.Invoke(message, exception);
+            };
+
+            this.wsClient.OnMessage += (message) =>
+            {
+                this.OnMessage(message);
+            };
+
+            this.wsClient.Connect();
+        }
+
+        public void Close()
+        {
+            this.wsClient.Close();
+        }
+
+        private void OnMessage(string message)
+        {
+            if (message == "Start")
+            {
+                this.isRunning = true;
+                return;
+            }
+            if (message == "Stop")
+            {
+                this.isRunning = false;
+                return;
+            }
+            if (message.StartsWith("FrameRate:"))
+            {
+                this.frameRate = int.Parse(message.Substring(message.IndexOf(":") + 1));
+                return;
+            }
+            if (message.StartsWith("Quality:"))
+            {
+                this.quality = int.Parse(message.Substring(message.IndexOf(":") + 1));
+                return;
+            }
+        }
+
+        public void SendScreenshot()
+        {
+            if (this.isRunning)
+            {
+                this.wsClient.Send(GetScreenshot());
+            }
+        }
+
+        private byte[] GetScreenshot() {
+            var screenshot = UnityEngine.ScreenCapture.CaptureScreenshotAsTexture();
+            var screenshotSerialized = UnityEngine.ImageConversion.EncodeToJPG(screenshot, quality: this.quality);
+
+            UnityEngine.Object.Destroy(screenshot);
+            return screenshotSerialized;
+        }
+    }
+}
diff --git a/Assets/AltTester/Runtime/Communication/LiveUpdateCommunicationHandler.cs.meta b/Assets/AltTester/Runtime/Communication/LiveUpdateCommunicationHandler.cs.meta
new file mode 100644
index 000000000..abd7e2264
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/LiveUpdateCommunicationHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e06e01567702940829685259dad0eb77
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/AltTester/Runtime/Communication/RuntimeCommunicationHandler.cs b/Assets/AltTester/Runtime/Communication/RuntimeCommunicationHandler.cs
new file mode 100644
index 000000000..60319ec4c
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/RuntimeCommunicationHandler.cs
@@ -0,0 +1,73 @@
+using System;
+
+namespace AltTester.AltTesterUnitySDK.Communication
+{
+    public class RuntimeCommunicationHandler
+    {
+        private IRuntimeWebSocketClient wsClient = null;
+        private ICommandHandler cmdHandler;
+
+        private readonly string host;
+        private readonly int port;
+        private readonly string appName;
+        private readonly string path = "/altws/app";
+
+        public CommunicationHandler OnConnect { get; set; }
+        public CommunicationHandler OnDisconnect { get; set; }
+        public CommunicationErrorHandler OnError { get; set; }
+
+        public bool IsConnected { get { return this.wsClient != null && this.wsClient.IsConnected; } }
+        public ICommandHandler CmdHandler { get { return this.cmdHandler; } }
+
+        public RuntimeCommunicationHandler(string host, int port, string appName)
+        {
+            this.host = host;
+            this.port = port;
+            this.appName = appName;
+
+            this.cmdHandler = new CommandHandler();
+        }
+
+        public void Connect()
+        {
+            #if UNITY_WEBGL
+                this.wsClient = new WebGLRuntimeWebSocketClient(this.host, this.port, this.path, this.appName);
+            #else
+                this.wsClient = new RuntimeWebSocketClient(this.host, this.port, this.path, this.appName);
+            #endif
+
+            this.wsClient.OnMessage += (message) =>
+            {
+                this.OnMessage(message);
+            };
+
+            this.wsClient.OnConnect += () =>
+            {
+                if (this.OnConnect != null) this.OnConnect();
+            };
+
+            this.wsClient.OnDisconnect += () =>
+            {
+                if (this.OnDisconnect != null) this.OnDisconnect();
+            };
+
+            this.wsClient.OnError += (message, exception) =>
+            {
+                if (this.OnError != null) this.OnError.Invoke(message, exception);
+            };
+
+            this.wsClient.Connect();
+            this.cmdHandler.OnSendMessage += this.wsClient.Send;
+        }
+
+        public void Close()
+        {
+            this.wsClient.Close();
+        }
+
+        private void OnMessage(string message)
+        {
+            this.cmdHandler.OnMessage(message);
+        }
+    }
+}
diff --git a/Assets/AltTester/Runtime/Communication/RuntimeCommunicationHandler.cs.meta b/Assets/AltTester/Runtime/Communication/RuntimeCommunicationHandler.cs.meta
new file mode 100644
index 000000000..98087f8fe
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/RuntimeCommunicationHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f21f2dbb53f358e4fa8d62300c0a353a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData:
+  assetBundleName:
+  assetBundleVariant:
diff --git a/Assets/AltTester/Runtime/Communication/RuntimeWebSocketClient.cs b/Assets/AltTester/Runtime/Communication/RuntimeWebSocketClient.cs
new file mode 100644
index 000000000..b05b0751e
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/RuntimeWebSocketClient.cs
@@ -0,0 +1,158 @@
+using System;
+using System.Text;
+using System.Threading;
+using System.Diagnostics;
+using AltWebSocketSharp;
+using AltTester.AltTesterUnitySDK.Driver.Communication;
+
+namespace AltTester.AltTesterUnitySDK.Communication
+{
+    public class RuntimeWebSocketClient : IRuntimeWebSocketClient
+    {
+        private WebSocket wsClient;
+
+        private readonly string host;
+        private readonly int port;
+        private readonly string appName;
+
+        public CommunicationHandler OnConnect { get; set; }
+        public CommunicationHandler OnDisconnect { get; set; }
+        public CommunicationErrorHandler OnError { get; set; }
+        public CommunicationMessageHandler OnMessage { get; set; }
+
+        public bool IsConnected { get { return this.wsClient != null && this.wsClient.IsAlive; } }
+
+        public RuntimeWebSocketClient(string host, int port, string path, string appName)
+        {
+            this.host = host;
+            this.port = port;
+            this.appName = appName;
+
+            Uri uri = Utils.CreateURI(host, port, path, appName);
+            wsClient = new WebSocket(uri.ToString());
+            wsClient.Log.Level = LogLevel.Fatal;
+
+            wsClient.OnOpen += (sender, message) =>
+            {
+                if (this.OnConnect != null) this.OnConnect();
+            };
+
+            wsClient.OnClose += (sender, args) =>
+            {
+                if (this.OnDisconnect != null) this.OnDisconnect();
+            };
+
+            wsClient.OnError += (sender, args) =>
+            {
+                if (this.OnError != null) this.OnError.Invoke(args.Message, args.Exception);
+            };
+
+            wsClient.OnMessage += (sender, args) =>
+            {
+                if (this.OnMessage != null) this.OnMessage.Invoke(args.Data);
+            };
+        }
+
+        public void Connect()
+        {
+            try
+            {
+                this.wsClient.ConnectAsync();
+            }
+            catch (Exception ex)
+            {
+                throw new RuntimeWebSocketClientException("An error occurred while starting the AltTester client.", ex);
+            }
+        }
+
+        public void Close()
+        {
+            this.wsClient.Close();
+        }
+
+        public void Send(string message)
+        {
+            this.wsClient.Send(message);
+        }
+
+        public void Send(byte[] message)
+        {
+            this.wsClient.Send(message);
+        }
+    }
+
+#if UNITY_WEBGL
+    public class WebGLRuntimeWebSocketClient : IRuntimeWebSocketClient
+    {
+        private WebGLWebSocket wsClient;
+
+        private readonly string host;
+        private readonly int port;
+        private readonly string appName;
+
+        public CommunicationHandler OnConnect { get; set; }
+        public CommunicationHandler OnDisconnect { get; set; }
+        public CommunicationErrorHandler OnError { get; set; }
+        public CommunicationMessageHandler OnMessage { get; set; }
+
+        public bool IsConnected { get { return this.wsClient != null && this.wsClient.State == WebSocketState.Open; } }
+
+        public WebGLRuntimeWebSocketClient(string host, int port, string path, string appName)
+        {
+            this.host = host;
+            this.port = port;
+            this.appName = appName;
+
+            Uri uri = Utils.CreateURI(host, port, path, appName);
+            wsClient = new WebGLWebSocket(uri.ToString());
+
+            wsClient.OnOpen += () =>
+            {
+                if (this.OnConnect != null) this.OnConnect.Invoke();
+
+                wsClient.OnError += (string errorMsg) =>
+                {
+                    if (this.OnError != null) this.OnError.Invoke(errorMsg, null);
+                };
+            };
+
+            wsClient.OnClose += (WebSocketCloseCode closeCode) =>
+            {
+                if (this.OnDisconnect != null) this.OnDisconnect.Invoke();
+            };
+
+            wsClient.OnMessage += (byte[] message) =>
+            {
+                if (this.OnMessage != null) this.OnMessage.Invoke(Encoding.UTF8.GetString(message));
+            };
+        }
+
+        public void Connect()
+        {
+            try
+            {
+                this.wsClient.Connect().GetAwaiter().GetResult();
+            }
+            catch (Exception ex)
+            {
+                throw new RuntimeWebSocketClientException("An error occurred while starting the AltTester client.", ex);
+            }
+        }
+
+        public void Close()
+        {
+            this.wsClient.Close().GetAwaiter().GetResult();
+        }
+
+        public void Send(string message)
+        {
+            this.wsClient.SendText(message).ConfigureAwait(false).GetAwaiter().GetResult();
+        }
+
+        public void Send(byte[] message)
+        {
+            this.wsClient.Send(message).ConfigureAwait(false).GetAwaiter().GetResult();
+        }
+    }
+#endif
+}
diff --git a/Assets/AltTester/Runtime/Communication/RuntimeWebSocketClient.cs.meta b/Assets/AltTester/Runtime/Communication/RuntimeWebSocketClient.cs.meta
new file mode 100644
index 000000000..bd7f1d1f1
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/RuntimeWebSocketClient.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0b2b6670ad51fdb45af13b9156e2f24b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData:
+  assetBundleName:
+  assetBundleVariant:
diff --git a/Assets/AltTester/Runtime/Communication/WebSocketWebGlCommunication.cs b/Assets/AltTester/Runtime/Communication/WebGLWebSocket.cs
similarity index 86%
rename from Assets/AltTester/Runtime/Communication/WebSocketWebGlCommunication.cs
rename to Assets/AltTester/Runtime/Communication/WebGLWebSocket.cs
index 212508d91..31d70a3a0 100644
--- a/Assets/AltTester/Runtime/Communication/WebSocketWebGlCommunication.cs
+++ b/Assets/AltTester/Runtime/Communication/WebGLWebSocket.cs
@@ -39,60 +39,6 @@ public enum WebSocketState
     public delegate void WebSocketErrorEventHandler(string errorMsg);
     public delegate void WebSocketCloseEventHandler(WebSocketCloseCode closeCode);
 
-    public class WebSocketWebGLCommunication : ICommunication
-    {
-        WebGLWebSocket webglWebSocket;
-        public WebSocketWebGLCommunication(ICommandHandler cmdHandler, string host, int port)
-        {
-            Uri uri;
-            if (!Uri.TryCreate(string.Format("ws://{0}:{1}/altws/app", host, port), UriKind.Absolute, out uri))
-            {
-                throw new Exception(String.Format("Invalid host or port {0}:{1}", host, port));
-            }
-
-            webglWebSocket = new WebGLWebSocket(uri.ToString());
-
-            var webGLWebSocketHandler = new AltWebGLWebSocketHandler(cmdHandler, webglWebSocket);
-
-            webglWebSocket.OnOpen += () =>
-            {
-                if (this.OnConnect != null) this.OnConnect.Invoke();
-                webglWebSocket.OnError += (string errorMsg) =>
-                {
-                    if (this.OnError != null) this.OnError.Invoke(errorMsg, null);
-                };
-            };
-
-            webglWebSocket.OnClose += (WebSocketCloseCode closeCode) =>
-            {
-                if (this.OnDisconnect != null) this.OnDisconnect.Invoke();
-            };
-        }
-        public bool IsConnected => webglWebSocket.State == WebSocketState.Open;
-        public bool IsListening => false;
-
-        public CommunicationHandler OnConnect { get; set; }
-        public CommunicationHandler OnDisconnect { get; set; }
-        public CommunicationErrorHandler OnError { get; set; }
-
-        public void Start()
-        {
-            try
-            {
-                webglWebSocket.Connect().GetAwaiter().GetResult();
-            }
-            catch (Exception ex)
-            {
-                throw new UnhandledStartCommError("An error occurred while starting client CommunicationProtocol", ex);
-            }
-        }
-
-        public void Stop()
-        {
-            webglWebSocket.Close().GetAwaiter().GetResult();
-        }
-
-    }
     public class WebGLWebSocket
     {
         /* WebSocket JSLIB functions */
@@ -428,4 +374,4 @@ public WebSocketInvalidStateException(string message) : base(message) { }
         public WebSocketInvalidStateException(string message, Exception inner) : base(message, inner) { }
     }
 #endif
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/Communication/WebGLWebSocket.cs.meta b/Assets/AltTester/Runtime/Communication/WebGLWebSocket.cs.meta
new file mode 100644
index 000000000..56b62a3ac
--- /dev/null
+++ b/Assets/AltTester/Runtime/Communication/WebGLWebSocket.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: eb7354a360b0a46acbda0c9f51aca74d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/AltTester/Runtime/Communication/WebSocketClientCommunication.cs b/Assets/AltTester/Runtime/Communication/WebSocketClientCommunication.cs
deleted file mode 100644
index b8d11cad0..000000000
--- a/Assets/AltTester/Runtime/Communication/WebSocketClientCommunication.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-using AltTester.AltTesterUnitySDK.Logging;
-using AltWebSocketSharp;
-
-namespace AltTester.AltTesterUnitySDK.Communication
-{
-    public class WebSocketClientCommunication : ICommunication
-    {
-        private static readonly NLog.Logger logger = ServerLogManager.Instance.GetCurrentClassLogger();
-        private readonly AltClientWebSocketHandler websocketHandler;
-
-        WebSocket wsClient;
-
-        private readonly int port;
-        private readonly string host;
-        private readonly string appName;
-
-        public WebSocketClientCommunication(ICommandHandler cmdHandler, string host, int port, string appName)
-        {
-            this.port = port;
-            this.host = host;
-            this.appName = appName;
-
-            Uri uri;
-
-            if (!Uri.TryCreate(string.Format("ws://{0}:{1}/altws/app?appName={2}", host, port, Uri.EscapeUriString(appName)), UriKind.Absolute, out uri))
-            {
-                throw new Exception(String.Format("Invalid host or port {0}:{1}", host, port));
-            }
-
-            wsClient = new WebSocket(uri.ToString());
-            wsClient.Log.Level = LogLevel.Fatal;
-            websocketHandler = new AltClientWebSocketHandler(wsClient, cmdHandler);
-
-            wsClient.OnOpen += (sender, message) =>
-            {
-                if (this.OnConnect != null) this.OnConnect();
-            };
-
-            wsClient.OnClose += (sender, args) =>
-            {
-                if (this.OnDisconnect != null) this.OnDisconnect();
-            };
-
-            wsClient.OnError += (sender, args) =>
-            {
-                if (this.OnError != null) this.OnError.Invoke(args.Message, args.Exception);
-            };
-        }
-
-        public bool IsConnected { get { return wsClient.IsAlive; } }
-        public bool IsListening { get { return false; } }
-
-        public CommunicationHandler OnConnect { get; set; }
-        public CommunicationHandler OnDisconnect { get; set; }
-        public CommunicationErrorHandler OnError { get; set; }
-
-        public void Start()
-        {
-            connect();
-        }
-
-        public void Stop()
-        {
-            wsClient.Close();
-        }
-
-        private void connect()
-        {
-            try
-            {
-                wsClient.ConnectAsync();
-            }
-            catch (Exception ex)
-            {
-                throw new UnhandledStartCommError("An error occurred while starting the AltTester client.", ex);
-            }
-        }
-    }
-}
diff --git a/Assets/AltTester/Runtime/Communication/WebSocketClientCommunication.cs.meta b/Assets/AltTester/Runtime/Communication/WebSocketClientCommunication.cs.meta
deleted file mode 100644
index 8b6c246bb..000000000
--- a/Assets/AltTester/Runtime/Communication/WebSocketClientCommunication.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 72cfb785a7a45be449737bec39cc88a6
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/AltTester/Runtime/Communication/WebSocketWebGlCommunication.cs.meta b/Assets/AltTester/Runtime/Communication/WebSocketWebGlCommunication.cs.meta
deleted file mode 100644
index 80284d8ea..000000000
--- a/Assets/AltTester/Runtime/Communication/WebSocketWebGlCommunication.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: f94aa16fe2859734798c6300f481a2ae
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/AltTester/Runtime/InputController.cs b/Assets/AltTester/Runtime/InputController.cs
index c73f05acf..cd23f6721 100644
--- a/Assets/AltTester/Runtime/InputController.cs
+++ b/Assets/AltTester/Runtime/InputController.cs
@@ -4,7 +4,6 @@
 using AltTester.AltTesterUnitySDK.Driver;
 using UnityEngine;
 
-
 namespace AltTester.AltTesterUnitySDK
 {
     public static class InputController
@@ -272,4 +271,4 @@ public static void ResetInput()
 
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/Logging/ServerLogManager.cs b/Assets/AltTester/Runtime/Logging/ServerLogManager.cs
index c2735beeb..30501247e 100644
--- a/Assets/AltTester/Runtime/Logging/ServerLogManager.cs
+++ b/Assets/AltTester/Runtime/Logging/ServerLogManager.cs
@@ -28,7 +28,6 @@ public static void SetupAltServerLogging(Dictionary<AltLogger, AltLogLevel> minL
                 Instance.GetCurrentClassLogger().Info("AltTester logs are saved at: " + logsFilePath);
         }
 
-
         /// <summary>
         /// Reconfigures the NLog logging level.
         /// </summary>
diff --git a/Assets/AltTester/Runtime/UI/AltDialog.cs b/Assets/AltTester/Runtime/UI/AltDialog.cs
index c6d4c7cc5..5ce4424fe 100644
--- a/Assets/AltTester/Runtime/UI/AltDialog.cs
+++ b/Assets/AltTester/Runtime/UI/AltDialog.cs
@@ -3,6 +3,9 @@
 using AltTester;
 using AltTester.AltTesterUnitySDK.Communication;
 using AltTester.AltTesterUnitySDK.Logging;
+using System.Collections;
+using UnityEngine;
+using AltWebSocketSharp;
 
 namespace AltTester.AltTesterUnitySDK.UI
 {
@@ -49,11 +52,15 @@ public class AltDialog : UnityEngine.MonoBehaviour
 
         public AltInstrumentationSettings InstrumentationSettings { get { return AltRunner._altRunner.InstrumentationSettings; } }
 
-        private ICommunication _communication;
+        private RuntimeCommunicationHandler _communication;
+        private LiveUpdateCommunicationHandler _liveUpdateCommunication;
+
         private readonly AltResponseQueue _updateQueue = new AltResponseQueue();
 
         HashSet<string> _connectedDrivers = new HashSet<string>();
 
+        private float update;
+
         protected void Start()
         {
             Dialog.SetActive(InstrumentationSettings.ShowPopUp);
@@ -73,6 +80,24 @@ protected void Start()
         protected void Update()
         {
             _updateQueue.Cycle();
+
+            if (this._liveUpdateCommunication == null || !this._liveUpdateCommunication.IsConnected)
+            {
+                return;
+            }
+
+            update += Time.deltaTime;
+            if (update > 1.0f / this._liveUpdateCommunication.FrameRate)
+            {
+                update = 0.0f;
+                StartCoroutine(this.SendScreenshot());
+            }
+        }
+
+        protected IEnumerator SendScreenshot()
+        {
+            yield return new UnityEngine.WaitForEndOfFrame();
+            this._liveUpdateCommunication.SendScreenshot();
         }
 
         protected void OnApplicationQuit()
@@ -217,38 +242,32 @@ public void ToggleCustomInput(bool value)
 
         private void InitClient()
         {
-            var cmdHandler = new CommandHandler();
-            cmdHandler.OnDriverConnect += OnDriverConnect;
-            cmdHandler.OnDriverDisconnect += OnDriverDisconnect;
-
-#if UNITY_WEBGL && !UNITY_EDITOR
-            _communication = new WebSocketWebGLCommunication(cmdHandler, InstrumentationSettings.AltServerHost, InstrumentationSettings.AltServerPort);
-#else
-            _communication = new WebSocketClientCommunication(cmdHandler, InstrumentationSettings.AltServerHost, InstrumentationSettings.AltServerPort, InstrumentationSettings.AppName);
-#endif
-
+            _communication = new RuntimeCommunicationHandler(InstrumentationSettings.AltServerHost, InstrumentationSettings.AltServerPort, InstrumentationSettings.AppName);
             _communication.OnConnect += OnConnect;
             _communication.OnDisconnect += OnDisconnect;
             _communication.OnError += OnError;
+
+            _communication.CmdHandler.OnDriverConnect += OnDriverConnect;
+            _communication.CmdHandler.OnDriverDisconnect += OnDriverDisconnect;
+
+            _liveUpdateCommunication = new LiveUpdateCommunicationHandler(InstrumentationSettings.AltServerHost, InstrumentationSettings.AltServerPort, InstrumentationSettings.AppName);
+            _liveUpdateCommunication.OnDisconnect += OnDisconnect;
+            _liveUpdateCommunication.OnError += OnError;
         }
 
         private void StartClient()
         {
+            OnStart();
             InitClient();
+
             try
             {
-                if (_communication == null || !_communication.IsListening) // Start only if it is not already listening
-                {
-                    _communication.Start();
-                }
-                if (!_communication.IsConnected) // Display dialog only if not connected
-                {
-                    OnStart();
-                }
+                _communication.Connect();
+                _liveUpdateCommunication.Connect();
             }
-            catch (UnhandledStartCommError ex)
+            catch (RuntimeWebSocketClientException ex)
             {
-                SetMessage("An unexpected error occurred while starting the AltTester client.", ERROR_COLOR, true);
+                SetMessage("2 An unexpected error occurred while starting the AltTester client.", ERROR_COLOR, true);
                 logger.Error(ex.InnerException, "An unexpected error occurred while starting the AltTester client.");
             }
             catch (Exception ex)
@@ -269,9 +288,18 @@ private void StopClient()
                 _communication.OnDisconnect = null;
                 _communication.OnError = null;
 
-                _communication.Stop();
+                _communication.Close();
                 _communication = null;
             }
+
+            if (_liveUpdateCommunication != null)
+            {
+                _liveUpdateCommunication.OnDisconnect = null;
+                _liveUpdateCommunication.OnError = null;
+
+                _liveUpdateCommunication.Close();
+                _liveUpdateCommunication = null;
+            }
         }
 
         private void OnStart()
@@ -292,6 +320,7 @@ private void OnConnect()
 
         private void OnDisconnect()
         {
+            this.StopClient();
             _connectedDrivers.Clear();
 
             _updateQueue.ScheduleResponse(() =>
diff --git a/Assets/AltTester/Runtime/UI/AltInputMark.cs b/Assets/AltTester/Runtime/UI/AltInputMark.cs
index cd1182a63..21b1fa8c8 100644
--- a/Assets/AltTester/Runtime/UI/AltInputMark.cs
+++ b/Assets/AltTester/Runtime/UI/AltInputMark.cs
@@ -1,4 +1,3 @@
-
 using UnityEngine.UI;
 
 public class AltInputMark : UnityEngine.MonoBehaviour
@@ -64,4 +63,4 @@ private void Finish()
         else
             gameObject.SetActive(false);
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/UI/AltInputsVisualizer.cs b/Assets/AltTester/Runtime/UI/AltInputsVisualizer.cs
index 1a2e40dce..4e70bb84d 100644
--- a/Assets/AltTester/Runtime/UI/AltInputsVisualizer.cs
+++ b/Assets/AltTester/Runtime/UI/AltInputsVisualizer.cs
@@ -87,4 +87,4 @@ private void PutMark(AltInputMark mark)
         mark.gameObject.SetActive(false);
         _pool.Add(mark);
     }
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/Runtime/UnityStruct/AltVector.cs b/Assets/AltTester/Runtime/UnityStruct/AltVector.cs
index 13f5287ac..2de96d5e3 100644
--- a/Assets/AltTester/Runtime/UnityStruct/AltVector.cs
+++ b/Assets/AltTester/Runtime/UnityStruct/AltVector.cs
@@ -14,5 +14,4 @@ public static UnityEngine.Vector3 ToUnity(this AltVector3 vector3)
             return new UnityEngine.Vector3(vector3.x, vector3.y, vector3.z);
         }
     }
-
-}
\ No newline at end of file
+}
diff --git a/Assets/AltTester/license.md.meta b/Assets/AltTester/license.md.meta
deleted file mode 100644
index 2c5e34755..000000000
--- a/Assets/AltTester/license.md.meta
+++ /dev/null
@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: e434ae0e1dc60d3428361dae857bcb30
-TextScriptImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/CHANGELOG.md b/Assets/CHANGELOG.md
index fbbf5e9a3..26c009212 100644
--- a/Assets/CHANGELOG.md
+++ b/Assets/CHANGELOG.md
@@ -1,802 +1,3 @@
-# Changes in version 1.8.2
+# Changelog
 
-Starting with this release the changelogs will be generated by GitHub and you can find them in the [Releases](https://github.com/alttester/AltTester-Unity-SDK/releases/tag/v.1.8.2) section.
-
-
-# Changes in version 1.8.1
-
-## New
-
-- "New command: Reset Input" !997
-- "Add SetStaticProperty Command" !926
-
-## Bug fixes and improvements
-
-- "Change websocket.dll to avoid conflict with other projects" !998
-- "InputSystem: Incorrect execution of coroutines for pressKey and other commands" !1008
-- "[New Input System] Double execution for EndTouch, BeginTouch, KeyUp and KeyDown commands" !985
-- "Change AltUnityCommands and AltUnityNotification names" !990
-- "GetScreenshot has duplicated code" !992
-
-
-## Contributors
-
--   Gombos Kriszta @GombosKriszta
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
--   Edvin Reich @ReichEdvin
--   Ru Cindrea @ru.cindrea
--   Sandrina-Emanuela Sere @sandrina.sere
-
-
-# Changes in version 1.8.0
-
-## New
-
-- "Create xml report when running tests from Editor/Command line" !756
-- "Create a method to enable/disable AltUnityDriver logging" !742
-
-## Bug fixes and improvements
-
-- "Tests not shown in Tests List if created inside AltUnityTester folder" !755
-- "Hovering mouse over button does not show tooltip" !748
-- "Set_text() doesn't work for Unity Input Field" !759
-- "[Python] move_touch send wrong parameters" !765
-- "Change method that uses reflection to have assembly as required parameters" !925
-- "[Advanced Usage] [Upgrade Guides] Invalid syntax for some C# examples" !763
-- "[AltUnity Tester Editor] Add Section for "Test run Settings" and replace screenshots" !761
-- "Some tests fail if Input System v >= 1.4.0" !766
-- "[Docs] Upgrade guide has C# examples in Python section" !758
-
-## Contributors
-
--   Gombos Kriszta @GombosKriszta
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
--   Edvin Reich @ReichEdvin
--   Ru Cindrea @ru.cindrea
--   Sandrina-Emanuela Sere @sandrina.sere
--   Diana Serb @diana.serb
--   Andrei-Mihai Onica @andrei.onica
-
-
-# Changes in version 1.7.2
-
-## New
-
-- "Multiple keypress with NIS" !721
-- "Add input visualizer for NIS" !716
-- "Moveable AltUnity logo in Inspector" !730
-
-## Bug fixes and improvements
-
-- "CallComponentMethod does not call private methods" !715
-- "[AltUnity Tester Editor > Build Settings] Delete note" !731
-- "[Get Started - Run your game in Unity...] Adapt admonition for Unity 2021" !735
-- "[API > AltUnityDriver > Input Actions] Add section for PressKeys() command" !737
-- "Fix documentation inconsistency" !728
-- "[AltUnity Tester Editor > Tests List] Document the use of Refresh button feature" !726
-- "Refactor the GetServerVersion command" !720
-- "[Inspector - Samplescenes] Click/Press action not working for creating stars" !718
-
-## Contributors
-
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
--   Edvin Reich @ReichEdvin
--   Ru Cindrea @ru.cindrea
-
-
-# Changes in version 1.7.1
-
-## New
-
-- "New commands FindObjectAtCoordinates" !650
-- "Documentation on how to add references to newinputsystem and newtonsoft json" !662
-- "Add option for multiple key pressing simultaneously" !646
-- "Logic for both input system to work together" #768
-- "Click with new input system" !639
-- "Scroll with new input system" !691
-- "MoveMouse with new input system" !688
-- "Key up and down with new input system" !685
-- "Press key with new input system" !765
-- "Add way to set a delay after each altUnity command" !684
-- "Add logic for BeginTouch, MoveTouch and EndTouch to support NIS" !704
-- "Tap with new input system" !656
-- "Swipe with new input system" !707
-- "Change server port from the game" !689
-- "Tilt with new input system" !712
-- "Updates for New Input System" !703
-
-## Bug fixes and improvements
-
-- "Not connecting to Android with PortForwarding on a different port" !652
-- "Multiple precompiled assemblies with the same name Newtonsoft.json" !654
-- "Fix issue in the python driver where WebsocketConnection class does not check the messageId" !653
-- "[API - AltUnityObject] List all commands under main section and remove Object Commands subsection" !670
-- "[Examples] Only one list expanded item in table of contents" !672
-- "Instrumented build does not connect to AltUnity Inspector/tests" #818
-- "[Get Started] "AltUnity Tester Window" or "AltUnity Tester" instead of "AltUnity Tester Editor"" !674
-- "SetText with submit true does not trigger the validation event that is triggered by enter" !673
-- "[License] Commands typos" !680
-- "[SampleScenes-Apk] UI elements not showing" !658
-- "Add examples to AltUnityPortForwarding section" !677
-- "Add clarifications to the license file" !681
-- "[Mac] iOS Player Settings button not functional" #780
-- "Logger should be used with full NLog.Logger name" !694
-- "AUT Editor Windows slow" !690
-- "Compressing the screenshot triggers app block after connecting with Inspector" !695
-- "Swipe should not tap elements that are dragged" !705
-- "Tests for API commands sometimes fail when Active Input Handling is set to "Input System Package (New)"" !710
-- "Instrumented game with AltUnity Tester 1.7.0 hangs in Bluestacks" !702
-- "[AltUnityRunnerPrefab] Text elements inconsistencies for Port change feature" !711
-- "[Get/SetDelayAfterCommand] Typo in description" !708
-- "Connecting Issue with il2cpp builds" !701
-- "Fix error thrown when only old input system is used" !706
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
--   Edvin Reich @ReichEdvin
-
-
-# Changes in version 1.7.0
-
-## New
-
--   "Set a global command timeout for commands"	!567
--   "Communication protocol" !419
--   "Communication protocol - Python" !440
--   "Java Communication Protocol"	!512
-
-## Bug fixes and improvements
-
--   "CallComponentMehtod and CallStaticMethod definitions"	!492
--   "[Get started] Add a note in "Instrument your game with AltUnity Server" section" !494
--   "Invoke input Events such as OnValueChange or OnSubmit on PressKey and SetText"	!495
--   "Communication protocol - Improve error handling" !498
--   "Find a more suggestive name for "API Documentation" !500
--   "From the unity editor, users should have all the info for getting started" !501
--   "Improve the parameter validation in python" !507
--   "rewrite CreateAltunityPrefab" !511
--   "ALTUNITYTESTER scripting symbol not visible in instrumented game - Unity 2020"	!513
--   "Update websocket-sharp" !514
--   "[API] Insert missing commands in documentation" !521
--   "Add option in AUT editor window to keep ALTUNITYTESTER define when apps are not in playmode" !522
--   "[Tests list] Tests checkboxes alignment inconsistency" !523
--   "[API methods] [Docs - API] Change param names of "cameraName" and "cameraPath" in "cameraValue"" !524
--   "Fix AltUnitySetTextCommand.cs error" !525
--   "[Command] Add a new command to retrieve static properties and fields" !527
--   "Add event when scene is loaded" !528
--   "Double clicking a test should open the test file at the line where the test is" !531
--   "[Run tests] Incorrect failed tests number" !532
--   "Handle WaitTimeOutException during Connect" !534
--   "Fix connection timeout error for Python" !535
--   "Logging documentation update" !536
--   "Standardize AltUnityDriver constructor" !538
--   "remove reconnect button from instrumented game" !540
--   "Add documentation for SetTimeScale" !543
--   "Input visualizer not assigned when option is checked in Build Settings" !547
--   "Disconnecting before handshake throws error in Java" !548
--   "[AltUnity Runner prefab popup] Rearange texts to be centered" !550
--   "GetComponentProperty fails when value is null." !552
--   "LoadScene throws null reference exception if name of the scene is not found" !553
--   "Add info about setting Run in Background" !558
--   "The table with Parameters for GetComponentProperty is not entirely visible in docs" !559
--   "Test are not opened and error is thrown in console when class name is different with file name" !561
--   "Remove Duplicate AltUnityId components in Sample Scenes" !562
--   "Popup reappears after every 5 seconds" !564
--   "Set a global command timeout for commands" !567
--   "Error handling - log stacktrace from instrumented game" !568
--   "Namespaces for AUT Instrumentation side" !572
--   "[AUT logs] Replace "Server" with "Tester""	!574
--   "Rename AltElement to AltUnityObject in python for consistency"	!575
--   "[Python] Modify AltUnityObject to have world coordinate as float instead of int" !576
--   "UI issues while "Play on Editor" when InvalidOperationException error" !577
--   "Include Samplescenes project package in Examples" !578
--   "Change the command GetPNGScreenshot to use ScreenCapture.CaptureScreenshot" !580
--   "Refactor wait commands to use callback pattern" !586
--   "CommandResponseTimeoutException is raised even if the driver is disconnected" !593
--   "Add AUT+UTF example in the docs" !595
--   "[API - BY-Selector] Update screenshot for AltId" !596
--   "Tester dev documentation" !598
--   "websocket server inside AltUnity Tester"	!600
--   "Strong type return message on AltUnityObject commands"	!603
--   "Update java dependencies" !604
--   "[Java] forwardIos not working"	!605
--   "[AltUnityRunnerPrefab] Incorrect message when another process is listening on the same port" !607
--   "Docs for GetComponentProperty / SetComponentProperty"	!609
--   "Include Samplescenes project package in Examples"	!610
--   "Add known issue about portforwarding ios in mono" !611
--   "CreateProperties and unhandled exception"	!612
--   "Update docstrings for the public methods" !613
--   "Add "Tester" in error message when Inspector cannot connect" !614
--   "[Port Forwarding] [Windows] UI issues when port forwarding starts from AUT Editor"	!615
--   "Modify GetScreenshot to send screenshot information as a png image" !617
--   "Fix connection issue for python bindings" !616
--   "[AltUnityRunnerPrefab] Wrong Tester version in popup when communication protocol is initiated"	!618
--   "[Overview - How it works] Remove the Previous and Next buttons from screenshot" !619
--   "Review java Driver library for consistency of api"	!622
--   "Add information about code stripping in documentation"	!623
--   "Update newtonsoft to v.10.0.1 netstandard1.3"	!626
--   "Fix connection issue for python bindings" !628
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
-
-# Changes in version 1.6.6
-
-## New
-
--   "Input Handle Mouse events every frame" !467
--   "Add CameraNotFound error handler" !477
--   "Drag/Drop events for KeyUp / KeyDown" !483
-
-## Bug fixes and improvements
-
--   "[Tests list] Case when Assembly-CSharp_editor.dll displays an extra number of selected tests and passed test icon" !482
--   "[Unity - Game] Large AUT popup and icon for the Asset Store package" !481
--   "Make menu item and window name for AUT editor the same" !471
--   "Tests list missing for cloned game project from Gitlab" !479
--   "Click method is not working" !476
--   "Change the Selectors name with name used in syntax" !478
--   "Eliminate note from "Write and execute first test" section" !475
--   "Preselected build location path deleted after canceling to change it" !473
--   "Fix inconsistencies in documentation" !472
--   "SetComponentProperty doesn't set value for properties in a struct" !469
--   "Add an x button to altunity popup, so it's more intuitive that it can be closed" !470
--   "Problems with maven release job" !466
--   "Pressing x button on the test report pop-up makes the pop-up reopen" !468
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
-
-# Changes in version 1.6.5
-
-## New
-
--   "Add new input press key command" #454
--   "Add new input commands: begintouch, touchmove, endtouch" #564
--   "simplify click & tap commands" #549
-
-## Bug fixes and improvements
-
--   "Update API Documentation's examples using changed method signature" #552
--   "Unity 2021 throws warning there are 2 eventSystems in the scene" #559
--   "PointerEventData.pointerPressRaycast.gameObject missing when doing tap from tests" #503
--   "Input action and show input are not finished when timescale is 0" #560
--   "Scroll/ScrollAndWait method not working" #555
--   "KeyDownLifeCycle does not raise events for Mouse1" #525
--   "[Unity Editor - AltUnity Tools menu] UI issues in the AltUnity Inspector window" #511
--   "Add license file to the Unity Asset Store" #568
--   "Warnings in console after \"Play in Editor\"" #570
--   "[AUT Editor] Display issues" #565
--   "Move test list in a separate container" #539
--   "[Swipe/SwipeAndWait] Object swiped only for value that exits the window border" #556
--   "Swipe/SwipeAndWait method results into swiping always the same direction" #505
--   "Make pressKey command in java and python consistent with c#" #508
--   "update parameter names for python example in portforwarding" #546
--   "AltUnityMockUpPointerInputModule monobehaviour instantiated with new" #519
--   "[TesterEditorPage] Test cases are not selected in the test list when selecting test that uses TestCase" #528
--   "[TesterEditorPage] Test name is not fully displayed when using test case" #529
--   "Update python example with the latest port forwarding method" #541
--   "Add CI job for linting python code" #506
--   "UI issues on dropdowns in Editor" #543
--   "Display Number of selected tests in AltUnityTesterEditor Test List" #540
--   "[Editor] Add menu item to add and remove AltId from current loaded scene" #517
--   "[Editor] Allow only one AltId per object" #518
--   "[AltUnity Tester Editor] Misalignment of some UI elements" #548
--   "Issue with Button.ClickEvent()" #163
--   "Screenshot aspect ratio is not respected when entering larger size than the screenshot itself" #536
--   "Check for an existing Assets/Resources directory before creating, to prevent creating an 'Assets/Resources 1' duplicate path." !424
--   "Resolve deprecation warning on UnityWebRequest.isNetworkError, which was introduced in Unity 2020.2." !423
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
--   Frank Hickman @fhickman
-
-# Changes in version 1.6.4
-
-## Bug fixes and improvements
-
--   "Path selector parsing and error handling" !408
--   "Fix the python bindings packaging script" !409
--   "FindObjects indexer does not take into account enabled false flag" !406
--   "move mouse does not move to the right position" !412
--   "fix for moving whole delta in last frame" !402
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
--   Andy @effalumper
-
-# Changes in version 1.6.3
-
-## New
-
--   "Add Find By.ID support with ID component" !359
--   "New command: unload scene" !373
--   "Add possibility to have multiple selectors for an object in the path" !382
--   "Add ability to set log level or turn logs off" !383
--   "Selector By.Path Select N-th element" !358
--   "Add AltUnityPortHandler to Nuget package" !367
-
-## Bug fixes and improvements
-
--   "GetScreenshot command fails in Android Emulator" !392
--   "Change WaitForObjectWithText to use the @text selector in the path" !387
--   "document By.PATH with more examples" !376
--   "CallComponentMethod with Optional Parameters methods does not work well when passing empty string" !388
--   "AltUnityPortForwarding.ForwardIOS not working with no device id specified" !384
--   "Python altElement transformId is misspelled 'tranformId' and its value is always 0" !379
--   "Get object's coordinates without dedicated camera" !378
--   "Add @text selector to be used in finding objects by path" !369
--   "[Editor] Move/Add output field closer to build location" !375
--   "Set logs limit from AltUnity editor window." !365
--   "[Editor] Open build location once build is complete" !374
--   "[Documentation] Update LoadScene Java example to use builder" !372
--   "Remove AltPopIconDrag.cs from repository" !371
--   "AltUnity Tester bug: EndLayoutGroup: BeginLayoutGroup must be called first" !368
--   "Add namespace to AltUnity.Editor scripts" !353
--   fix log overflow !364
--   "Refactor Input LifeCycle methods" !362
--   "Append tester version to the name of the unity package" !360
--   "Add explanation in documentation about unity package download" !361
--   "Make input script valid when ALTUNITYTESTER is not defined" !357
--   "Implement GetAllActiveCameras" !354
--   "Add example project for writing tests with C# nuget package" !352
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Dezmerean @robert-dezmerean
--   Iuliana Todoran @iuliana.todoran
--   Robert Poienar @robert_poienar
--   Ochir Darmaev @ochirdarmaev
-
-# Changes in version 1.6.2
-
-## New
-
--   "Publish altUnity on nuget" !328
-
-## Bug fixes and improvements
-
--   "3D object disappears when highlighted for screenshot" !349
--   "Add possibility to call a method from an object inside an gameObject" !348
--   "parentId is wrong for canvas objects" !341
--   "Click event is not triggered when swipe is moving but remains on the same object" !347
--   "Wrong shaders are assigned to materials after object is highlighted" !346
--   "call CreateJsonFileForInputMappingOfAxis during build from commandline" !343
--   "Return value for CallStaticMethod is wrong in documentation" !342
--   "Handle case when there is no camera selecting object from screenshot" !318
--   "Keypress moves the character 2 positions instead of 1" !337
--   "Remove tests requiring moq.dll from unitypackage" !340
--   "AltElement repr does not conform to the standard in python" !339
--   "Add flag to make sure AltUnity Tester can be added only to dev builds" !335
--   "Add a note to documentation regarding that only dev builds should have AltUnity Tester" !334
--   "Spelling mistake in AltUnityTester UI and documentation." !333
--   "Add an overview to License section, so users are not confused what restrictions they have" !332
--   "Port forwarding text has different color in dark theme than other text" !329
--   "Iterate enabled cameras on HightlightObjectFromCoordinatesCommand" !330
--   "Fix inspector documentation link" !326
--   "Add documentation for selecting scenes when building the game"!325
--   "Update AltUnity Tester documentation structure" !324
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Gombos Kriszta @GombosKriszta
--   Robert Poienar @robert_poienar
-
-# Changes in version 1.6.1
-
-## Bug fixes and improvements
-
--   Solved memory problems cause by Get/SetPixels !320
--   Removed annoying Debug.LogError() !317
--   Fixed logging exceptions !316
--   Added link to AltUnityInspector !321
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Robert Poienar @robert_poienar
-
-# Changes in version 1.6.0
-
-## Bug fixes and improvements
-
--   "Remove deprecated methods" !301
--   "Fix AltUnitySyncCommand to receive until message id matches" !311
--   AltUnityTapCommand. Add clickTime !288
--   "GetAllLoadedScenesCommand return scene by build index and not by loaded scenes" !309
--   Fix bug in GetAllLoadedScene !291
--   "String is not considerate a primitive" !307
--   "swipe and wait does not wait the expected duration because of float conversion" !306
--   "add message id to driver server communication" !303
--   "Input actions are not finished when timeScale is 0" !302
--   "Wrong scale difference/original size of screenshot is sent" !300
--   "Change AltUnityProperty and AltUnityField to be the same and add type field" !297
--   "Add more control what fields should return get_all_fields" !267
--   "Pressing mouse button doesn't click on buttons" !296
--   "Display an error message If the port AltUnityServer listens to is used by another process" !295
--   "If no size value is given for screenshot command then it should return full size screenshot" !294
--   "Method to GetAllElements with minimal information" !293
--   "GetComponentProperty sends errorNullRefferenceMessage instead of errorComponentNotFoundMessage" !292
--   "Add try catch when transforming game object to altunityobject" !287
--   "GetMemberForObjectComponent doesn't recognize all properties or fields" !286
--   "Change command name from FindObjectWhichContains to FindObjectWhichContain" !264
--   "Update retry logging in unity in AltUnityDriver" !275
--   "Update gitignore to ignore more files that do not need to be in the repo" !284
--   Update documentation
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Ru Cindrea @ru.cindrea
--   pusoktimea @pusoktimea
--   Alexandru Rotaru @alex.rotaru
--   Raluca Vaida @raluca.vaida
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Poienar @robert_poienar
--   SivanYakir @SivanYakir
--   Ka3u6y6a @ka3u6y6a
-
-# Changes in version 1.5.7
-
-## Bug fixes and improvements
-
--   "Remove null checker to make compatible with .net 3.x" !268
--   "GetVersion should return server version when there is a mismatch" !266
--   "Load scene additive" !265
--   "AltUnityDriver python does not display warnings by default" !263
--   Update documentation
-
-## Contributors
-
--   Dorin Oltean @dorinaltom
--   Ru Cindrea @ru.cindrea
--   pusoktimea @pusoktimea
--   Alexandru Rotaru @alex.rotaru
--   Dorel @doreln
--   Bogdan Birnicu @bogdan.birnicu
--   Raluca Vaida @raluca.vaida
--   Gombos Kriszta @GombosKriszta
--   Andra Cardas @andra.cardas
--   Robert Poienar @robert_poienar
-
-# Changes in version 1.5.6
-
-## Bug fixes and improvements
-
--   "Make "Drag" and "Drop" command deprecated" !259
--   "Make AltUnityDriver interface consistent across all language clients" !257
--   "Add option to specific camera other than name in find objects commands" !207
--   "Python - iOS - exception still thrown if we try to connect but server is not yet running" !255
--   "click_element() not working in python" !254
--   "Multiple warning messages displayed when using the editor" !252
--   "Update documentation for overview and get started" !251
--   "Test List doesn't appear when configuration page is created" !250
--   "Double clicking on a test in AltUnity Tester window doesn't open the test file in IDE" !249
--   "Make the Android / iOS options under Platform more clear" !248
--   "Tilt command not working" !247
--   Exposing the AltBaseSettings to support users to write custom commands. !253
--   "AltElement in Python doesn't have parentId property" !238
--   "Class name is checked although not all tests under it are checked (in the Tests list)" !237
--   "Scroll command not functioning" !246
--   "No relevant error message and build is not made when having empty "Output path"" !244
--   "General Method to run c# test in command line" !242
--   "Examples are missing from unity package that is in documentation" !239
--   "Continuous error triggered when making changes to the test file while the game is running" !245
--   ""NullReferenceException" displayed as info message after running tests" !243
--   "Finding parent by path gives "failedToParseMethodArguments"" !228
--   "Finding object by component should accept component name just like other methods" !241
--   "Handle null exception in case object has null components(invalid scripts)" !208
--   Added get_all_fields_of() for Python along with Typing help !232
--   Test List Improvements !240
--   Added get_all_components() for Python along with Typing help !231
--   "AltUnityTesterEditorSettings should not appear in the project files" !236
--   "Update example tests in order to avoid possible naming conflicts" !233
--   "Rename some of the server commands all to respect the same pattern" !235
--   "Move "Run tests" section below "Build" and "Run" sections" !234
--   "Add example in documentation for function that are missing" !209
--   Changed all the is to the ==, where python complained !230
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Dorin Oltean @dorinaltom
--   Ru Cindrea @ru.cindrea
--   pusoktimea @pusoktimea
--   Alexandru Rotaru @alex.rotaru
--   Dorel @doreln
--   Bogdan Birnicu @bogdan.birnicu
--   Raluca Vaida @raluca.vaida
--   Mike Talalaevskiy @Day0Dreamer
--   Miguel Ibero @miguel.ibero
--   dcole-gsn @dcole-gsn
-
-# Changes in version 1.5.5
-
-## Bug fixes and improvements
-
--   "Create in sample scene a button that load other scene and test it" !221
--   "Add a way to control the amount of output" !222
--   "Add option to set port in BuildGame Method and move to Awake runner instantiation settings" !213
--   "Compile errors after adding 'ALTUNITYTESTER' in scripting define symbols" !210
--   "Add Text and TextMeshPro Text component to SetText" !220
--   "Add favicon to altom.gitlab.io" !223
--   "If the server is not started when calling getServerVersion, it's stuck" !217
--   "Add license information in documentation" !219
--   "Add google groups links in documentation" !215
--   "Move Bindings folder from BindingAndExample Folder" !214
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Ru Cindrea @ru.cindrea
--   pusoktimea @pusoktimea
--   Alexandru Rotaru @alex.rotaru
--   Mike Talalaevskiy @Day0Dreamer
-
-# Changes in version 1.5.4
-
-## New
-
--   Double tap method for AltUnityObject !190
--   Add TapCustom command !194
--   "Add AltUnity to Maven" !204
-
-## Bug fixes and improvements
-
--   "C# receive method adds additional characters in the response" !206
--   "Some elements to be highlighted are not found" !205
--   "Screenshot with object highlighted not working for camera" !196
--   "Return the object with the screenshot when given x y coordinates" !201
--   "Add Tank Sample to documentation" !191
--   "Change function name in python from click_Event to click_event" !200
--   "Error when uploading to pypi the latest version" !193
--   "Modify check version for earlier version that don't have the command to not throw an error" !199
--   "Sort better the order how method are returned from getAllMethods command" !198
--   "Make input visualizer pulsate when clicking" !189
--   "Add information about communication between server and driver" !197
--   "Add a note to Documentation about not having to rebuild the game when tests are changed" !192
--   "Are there similar methods for HoldButton , HoldButtonAndWait and Send_keys in Python binding?" !184
--   "Add javadoc to AltUnity tester" !203
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Ru Cindrea @ru.cindrea
--   Ka3u6y6a @ka3u6y6a
--   Andrei Ionut Benyi @ionut.benyi
--   pusoktimea @pusoktimea
--   Alexandru Rotaru @alex.rotaru
-
-# Changes in version 1.5.3
-
-## New
-
--   Add methods for swipe by more then two points !173
--   Server needs GetVersion() command" !172
-
-## Bug fixes and improvements
-
--   Move tests that search for multiple object to another scene" !185
--   Update ReadMe from project" !186
--   Add java package in pages and bindings" !183
--   Test in Python doesn't run at all" !177
--   Error thrown for object name when Encoding/Decoding" !178
--   Implement static `removePortForwarding` methods so that they don't remove all other existing ports that are forwarded" !167
--   Add link to java examples documentation" !182
--   adb path should be configurable on windows and should be part of Android (not iOS) Settings" !179
--   Python bindings: missed install requirement - "deprecated" package" !180
--   Add documentation for port forwarding for iOS and Android" !160
--   Change class names to have prefix alt|altunity" !176
--   If extension is not define in output path it will be set automatically !156
--   AltUnityPopCanvas set to be in front and option to deactivate" !175
--   Input axis not working if it not set all four values" !174
--   Bug: null reference returned for object where parent is canvas with world space and no camera set" !169
--   Update appium tests" !170
--   Python bindings - port forwarding cannot be done if Appium is not used" !159
--   HighlightSelectedObjectCommand should return "Ok" not "null"" !168
--   Refresh port forwarding throws error" !166
--   SetText doesn’t work for TextMeshPro components" !164
--   DeviceId overlapping with Local Port Id" !165
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Ru Cindrea @ru.cindrea
--   Ka3u6y6a @ka3u6y6a
--   Andrei Ionut Benyi @ionut.benyi
--   pusoktimea @pusoktimea
--   Alexandru Rotaru @alex.rotaru
-
-# Changes in version 1.5.2
-
-## New
-
--   Add option to activate input visualizer from AltUnityTester GUI !145
--   Add options to disable pop-up from GUI !154
--   Screenshot functionality for all 3 drivers !140
-
-## Bug fixes and improvements
-
--   Find Objects doesn't find all objects !144
--   ALTUNITYTESTER define symbol is not inserted at the right platform when playing in editor !155
--   Add theme to documentation !147
--   Error on python 2.7: TypeError super() takes at least 1 argument (0 given) !146
--   Made IP change to accept all incoming connections to AltUnityServer, at... !151
--   Add gitter link to documentation !152
--   Fix java Wait for object not be present !150
--   Fix click at coordinates on python !149
--   wait_for_object fails !142
--   Fix documentation title and broken links
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Ru Cindrea @ru.cindrea
--   Thejus Krishna
--   Ka3u6y6a @ka3u6y6a
--   Raluca Vaida @raluca.vaida
--   pusoktimea @pusoktimea
--   Alexandru Rotaru @alex.rotaru
-
-# Changes in version 1.5.0
-
-## Refactoring
-
--   Modify C# driver not to depend on Unity !131
--   Project refactoring: Server !108
--   Project refactoring: AltDriver(python) !113
--   Project refactoring: AltDriver(Java) !115
-
-## New
-
--   Add pop-up to AltUnityPrefab !106
--   Add clicks visualization !122
--   Add set text command !125
--   Open file test when clicking on a test from window editor !118
--   Create documentation in form of a wiki !128
--   Get Server output !107
-
-## Bug fixes and improvements:
-
--   Divide editor window to see better the content !119
--   The method callComponentMethod was constructing an AltUnityObjectAction with...!109
--   Server throw more generic error for getComponent than it used to !130
--   Add test for Java method to callComponentMethod with assembly name too !111
--   Correct obsolete texts in c# driver !123
--   Update readme with correct url to download latest Unity package !116
--   AltUnityTester - Create new AltUnity Test doesn't do anything !110
--   Add command for getting text from ui text and text mesh pro !120
--   Missing tests for getAllElement in python !134
--   Missing tests for FindObjectWhichContains!135
--   Add test for "inspector" commands c# !137
--   Change tests to be independent of the screen resolution !129
--   Missing command in c# driver: WaitForObjectWhichContains !124
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Ru Cindrea @ru.cindrea
--   Ka3u6y6a @ka3u6y6a
--   ricardo larrahondo @ricardorlg
-
-# Changes in version 1.4.0
-
-## Keyboard, joystick and mouse simulation
-
--   Add keyboard input simulation !98
--   Joystick controls !102
-
-## Bug fixes and improvements:
-
--   Modify the project to use AssemblyQualifiedName instead of just class name" !97
--   Make "Play in Editor" to open the first scene or to put the AltUnityTester in the active scene !100
--   Fix AltUnityTestWindow when using AssemblyDefinitionFiles !99
--   Add timeout to get_current_scene call during socket setup !94
--   "setup_port_forwarding" method in runner.py file from python bindings is throwing an exception !95
--   Set adbFileName in linux !93
--   Fix ClickOnScreenAtXy !92
--   driver.findElement is unable to find some elements in ver 1.3.0 !91
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Ru Cindrea @ru.cindrea
--   Arthur @LordStuart
-
-# Changes in version 1.3.0
-
-## Improvements to Unity Editor GUI / AltUnityTester Unity Test Runner
-
--   Connected devices and port forwarding status are shown in UI, more than one device can be used at a time - !81
--   Command separator is configurable (from code and UI) - !79
--   More build options - !77
--   Improvements to test running finish dialog - !75, !82
--   Ability to run tests in Editor - !55
-
-## Running in cloud
-
--   Added documentation and example for running on AWS Device Farm - !20
--   Fixed issue with port fowarding on iOS Python client that caused problems with running in Bitbar and AWS cloud - !76
-
-## Overall Refactoring:
-
--   Split AltUnityTesterEditor and provide an interface for building a game with AltUnityTester on different platforms - !71
--   Java refactoring and improvements - !60, !58
-
-## Release Artifacts:
-
--   Create deployment to pages - !66
--   Create AltUnityTester package for every branch via CI pipeline - !65
-
-## Bug fixes and improvements:
-
--   WaitForElementToNotBePresent doesn't work correctly - !89
--   IdProject is not created when Assets is not parent for AltUnityTester folder - !87
--   Change appium methods duration variable name to be suggestive - !83
--   NullREferenceException is returned when calling tapScreen twice - !74
--   AltUnityRunnerPrefab is not removed when Run in Editor - !73
--   Tester should work without any camera in the scene - !72
--   Run failed test or selected will run all the test - !69
--   Driver froze when the information receive is a certain size - !70
--   Disable objects not found by FindObjects - !68
--   Make AltUnityTester work with Unity 2017.x - !64
--   Fix links in Java bindings readme - !62
--   Update for Python Bindings runner.py - !61
-
-## New AltUnityRunner commands and features:
-
--   (C# only) GetScreenshot command - !86, !78, !56, !54
--   Add way to find elements that are not enabled - !50
--   Add GetAllObjects(), GetAllMethods(), GetAllComponents, GetAllScenes(), GetAllProperties() commands, add way to find objects by IDs - !63, !59, !53, !51
--   Add command to set Time.timeline - !85
-
-## Contributors
-
--   Robert Poienar @robert_poienar
--   Ru Cindrea @ru.cindrea
--   Kamil @kaszarek
--   Nikita Ershov @ershov1
--   Napster @napstr
+See [CHANGELOG.md](https://github.com/alttester/AltTester-Unity-SDK/blob/master/CHANGELOG.md) for more information.
diff --git a/Assets/Examples/Test/Editor/Server/WebSocketClientCommunicationTests.cs b/Assets/Examples/Test/Editor/Server/WebSocketClientCommunicationTests.cs
deleted file mode 100644
index e0e59c537..000000000
--- a/Assets/Examples/Test/Editor/Server/WebSocketClientCommunicationTests.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-using System;
-using System.Diagnostics;
-using AltTester.AltTesterUnitySDK.Communication;
-using NUnit.Framework;
-using AltWebSocketSharp.Server;
-using AltWebSocketSharp;
-
-namespace Altom.AltInstrumentation.Tests
-{
-    public class MockCommandHandler : ICommandHandler
-    {
-        public SendMessageHandler OnSendMessage { get; set; }
-
-        public NotificationHandler OnDriverConnect { get; set; }
-        public NotificationHandler OnDriverDisconnect { get; set; }
-
-        public void OnMessage(string data)
-        {
-            throw new System.NotImplementedException();
-        }
-
-        public void Send(string data)
-        {
-            if (this.OnSendMessage != null)
-            {
-                this.OnSendMessage.Invoke(data);
-            }
-        }
-    }
-
-    public class MockServerHandler : WebSocketBehavior
-    {
-        protected override void OnOpen()
-        {
-            base.OnOpen();
-        }
-
-        protected override void OnClose(CloseEventArgs e)
-        {
-            base.OnClose(e);
-        }
-
-        protected override void OnError(ErrorEventArgs e)
-        {
-            base.OnError(e);
-        }
-
-    }
-
-    public class WebSocketClientCommunicationTests
-    {
-
-        [Test]
-        public void TestConnectWithNoServer()
-        {
-            var cmdHandler = new MockCommandHandler();
-
-            var client = new WebSocketClientCommunication(cmdHandler, "localhost", 13420, "__default__");
-            bool onConnect = false;
-            client.OnConnect += () =>
-            {
-                onConnect = true;
-            };
-
-            bool onDisconnect = false;
-            client.OnDisconnect += () =>
-            {
-                onDisconnect = true;
-            };
-
-            client.OnError += (string message, Exception error) =>
-            {
-                Assert.Fail("No errors expected");
-            };
-
-            client.Start();
-            client.Stop();
-            Assert.IsFalse(onConnect, "Should not be able to connect");
-            Assert.IsTrue(onDisconnect, "Should call disconnect");
-        }
-
-        [Test]
-        public void TestConnectWithServer()
-        {
-            var cmdHandler = new MockCommandHandler();
-
-            var wsServer = new WebSocketServer("ws://0.0.0.0:13420");
-
-            wsServer.AddWebSocketService<MockServerHandler>("/altws/app", (context, handler) =>
-            {
-
-            });
-            wsServer.Start();
-            var stopwatch = Stopwatch.StartNew();
-            while (!wsServer.IsListening && stopwatch.ElapsedMilliseconds < 2000) ;
-            Assert.IsTrue(wsServer.IsListening, "Expected to be listening");
-
-            try
-            {
-                bool connected = false;
-                bool disconnected = false;
-
-                var client = new WebSocketClientCommunication(cmdHandler, "localhost", 13420, "__default__");
-
-                client.OnConnect += () =>
-                {
-                    connected = true;
-
-                };
-
-                client.OnDisconnect += () =>
-                {
-                    disconnected = true;
-
-                };
-
-                client.OnError += (string message, Exception error) =>
-                {
-                    Assert.Fail("No errors expected");
-                };
-
-                client.Start();
-
-                stopwatch = Stopwatch.StartNew();
-                while (!connected && stopwatch.ElapsedMilliseconds < 10000) ;
-                Assert.IsTrue(connected, "Expected to be connected");
-
-                client.Stop();
-                stopwatch = Stopwatch.StartNew();
-                while (!disconnected && stopwatch.ElapsedMilliseconds < 2000) ;
-
-                Assert.IsTrue(disconnected, "Expected to be disconnected");
-            }
-            finally
-            {
-                wsServer.Stop();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/Assets/Examples/Test/Editor/Server/WebSocketClientCommunicationTests.cs.meta b/Assets/Examples/Test/Editor/Server/WebSocketClientCommunicationTests.cs.meta
deleted file mode 100644
index 7bec65387..000000000
--- a/Assets/Examples/Test/Editor/Server/WebSocketClientCommunicationTests.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 963329771640fc3498a2b6ebad897b48
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..fbbf5e9a3
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,802 @@
+# Changes in version 1.8.2
+
+Starting with this release the changelogs will be generated by GitHub and you can find them in the [Releases](https://github.com/alttester/AltTester-Unity-SDK/releases/tag/v.1.8.2) section.
+
+
+# Changes in version 1.8.1
+
+## New
+
+- "New command: Reset Input" !997
+- "Add SetStaticProperty Command" !926
+
+## Bug fixes and improvements
+
+- "Change websocket.dll to avoid conflict with other projects" !998
+- "InputSystem: Incorrect execution of coroutines for pressKey and other commands" !1008
+- "[New Input System] Double execution for EndTouch, BeginTouch, KeyUp and KeyDown commands" !985
+- "Change AltUnityCommands and AltUnityNotification names" !990
+- "GetScreenshot has duplicated code" !992
+
+
+## Contributors
+
+-   Gombos Kriszta @GombosKriszta
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+-   Edvin Reich @ReichEdvin
+-   Ru Cindrea @ru.cindrea
+-   Sandrina-Emanuela Sere @sandrina.sere
+
+
+# Changes in version 1.8.0
+
+## New
+
+- "Create xml report when running tests from Editor/Command line" !756
+- "Create a method to enable/disable AltUnityDriver logging" !742
+
+## Bug fixes and improvements
+
+- "Tests not shown in Tests List if created inside AltUnityTester folder" !755
+- "Hovering mouse over button does not show tooltip" !748
+- "Set_text() doesn't work for Unity Input Field" !759
+- "[Python] move_touch send wrong parameters" !765
+- "Change method that uses reflection to have assembly as required parameters" !925
+- "[Advanced Usage] [Upgrade Guides] Invalid syntax for some C# examples" !763
+- "[AltUnity Tester Editor] Add Section for "Test run Settings" and replace screenshots" !761
+- "Some tests fail if Input System v >= 1.4.0" !766
+- "[Docs] Upgrade guide has C# examples in Python section" !758
+
+## Contributors
+
+-   Gombos Kriszta @GombosKriszta
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+-   Edvin Reich @ReichEdvin
+-   Ru Cindrea @ru.cindrea
+-   Sandrina-Emanuela Sere @sandrina.sere
+-   Diana Serb @diana.serb
+-   Andrei-Mihai Onica @andrei.onica
+
+
+# Changes in version 1.7.2
+
+## New
+
+- "Multiple keypress with NIS" !721
+- "Add input visualizer for NIS" !716
+- "Moveable AltUnity logo in Inspector" !730
+
+## Bug fixes and improvements
+
+- "CallComponentMethod does not call private methods" !715
+- "[AltUnity Tester Editor > Build Settings] Delete note" !731
+- "[Get Started - Run your game in Unity...] Adapt admonition for Unity 2021" !735
+- "[API > AltUnityDriver > Input Actions] Add section for PressKeys() command" !737
+- "Fix documentation inconsistency" !728
+- "[AltUnity Tester Editor > Tests List] Document the use of Refresh button feature" !726
+- "Refactor the GetServerVersion command" !720
+- "[Inspector - Samplescenes] Click/Press action not working for creating stars" !718
+
+## Contributors
+
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+-   Edvin Reich @ReichEdvin
+-   Ru Cindrea @ru.cindrea
+
+
+# Changes in version 1.7.1
+
+## New
+
+- "New commands FindObjectAtCoordinates" !650
+- "Documentation on how to add references to newinputsystem and newtonsoft json" !662
+- "Add option for multiple key pressing simultaneously" !646
+- "Logic for both input system to work together" #768
+- "Click with new input system" !639
+- "Scroll with new input system" !691
+- "MoveMouse with new input system" !688
+- "Key up and down with new input system" !685
+- "Press key with new input system" !765
+- "Add way to set a delay after each altUnity command" !684
+- "Add logic for BeginTouch, MoveTouch and EndTouch to support NIS" !704
+- "Tap with new input system" !656
+- "Swipe with new input system" !707
+- "Change server port from the game" !689
+- "Tilt with new input system" !712
+- "Updates for New Input System" !703
+
+## Bug fixes and improvements
+
+- "Not connecting to Android with PortForwarding on a different port" !652
+- "Multiple precompiled assemblies with the same name Newtonsoft.json" !654
+- "Fix issue in the python driver where WebsocketConnection class does not check the messageId" !653
+- "[API - AltUnityObject] List all commands under main section and remove Object Commands subsection" !670
+- "[Examples] Only one list expanded item in table of contents" !672
+- "Instrumented build does not connect to AltUnity Inspector/tests" #818
+- "[Get Started] "AltUnity Tester Window" or "AltUnity Tester" instead of "AltUnity Tester Editor"" !674
+- "SetText with submit true does not trigger the validation event that is triggered by enter" !673
+- "[License] Commands typos" !680
+- "[SampleScenes-Apk] UI elements not showing" !658
+- "Add examples to AltUnityPortForwarding section" !677
+- "Add clarifications to the license file" !681
+- "[Mac] iOS Player Settings button not functional" #780
+- "Logger should be used with full NLog.Logger name" !694
+- "AUT Editor Windows slow" !690
+- "Compressing the screenshot triggers app block after connecting with Inspector" !695
+- "Swipe should not tap elements that are dragged" !705
+- "Tests for API commands sometimes fail when Active Input Handling is set to "Input System Package (New)"" !710
+- "Instrumented game with AltUnity Tester 1.7.0 hangs in Bluestacks" !702
+- "[AltUnityRunnerPrefab] Text elements inconsistencies for Port change feature" !711
+- "[Get/SetDelayAfterCommand] Typo in description" !708
+- "Connecting Issue with il2cpp builds" !701
+- "Fix error thrown when only old input system is used" !706
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+-   Edvin Reich @ReichEdvin
+
+
+# Changes in version 1.7.0
+
+## New
+
+-   "Set a global command timeout for commands"	!567
+-   "Communication protocol" !419
+-   "Communication protocol - Python" !440
+-   "Java Communication Protocol"	!512
+
+## Bug fixes and improvements
+
+-   "CallComponentMehtod and CallStaticMethod definitions"	!492
+-   "[Get started] Add a note in "Instrument your game with AltUnity Server" section" !494
+-   "Invoke input Events such as OnValueChange or OnSubmit on PressKey and SetText"	!495
+-   "Communication protocol - Improve error handling" !498
+-   "Find a more suggestive name for "API Documentation" !500
+-   "From the unity editor, users should have all the info for getting started" !501
+-   "Improve the parameter validation in python" !507
+-   "rewrite CreateAltunityPrefab" !511
+-   "ALTUNITYTESTER scripting symbol not visible in instrumented game - Unity 2020"	!513
+-   "Update websocket-sharp" !514
+-   "[API] Insert missing commands in documentation" !521
+-   "Add option in AUT editor window to keep ALTUNITYTESTER define when apps are not in playmode" !522
+-   "[Tests list] Tests checkboxes alignment inconsistency" !523
+-   "[API methods] [Docs - API] Change param names of "cameraName" and "cameraPath" in "cameraValue"" !524
+-   "Fix AltUnitySetTextCommand.cs error" !525
+-   "[Command] Add a new command to retrieve static properties and fields" !527
+-   "Add event when scene is loaded" !528
+-   "Double clicking a test should open the test file at the line where the test is" !531
+-   "[Run tests] Incorrect failed tests number" !532
+-   "Handle WaitTimeOutException during Connect" !534
+-   "Fix connection timeout error for Python" !535
+-   "Logging documentation update" !536
+-   "Standardize AltUnityDriver constructor" !538
+-   "remove reconnect button from instrumented game" !540
+-   "Add documentation for SetTimeScale" !543
+-   "Input visualizer not assigned when option is checked in Build Settings" !547
+-   "Disconnecting before handshake throws error in Java" !548
+-   "[AltUnity Runner prefab popup] Rearange texts to be centered" !550
+-   "GetComponentProperty fails when value is null." !552
+-   "LoadScene throws null reference exception if name of the scene is not found" !553
+-   "Add info about setting Run in Background" !558
+-   "The table with Parameters for GetComponentProperty is not entirely visible in docs" !559
+-   "Test are not opened and error is thrown in console when class name is different with file name" !561
+-   "Remove Duplicate AltUnityId components in Sample Scenes" !562
+-   "Popup reappears after every 5 seconds" !564
+-   "Set a global command timeout for commands" !567
+-   "Error handling - log stacktrace from instrumented game" !568
+-   "Namespaces for AUT Instrumentation side" !572
+-   "[AUT logs] Replace "Server" with "Tester""	!574
+-   "Rename AltElement to AltUnityObject in python for consistency"	!575
+-   "[Python] Modify AltUnityObject to have world coordinate as float instead of int" !576
+-   "UI issues while "Play on Editor" when InvalidOperationException error" !577
+-   "Include Samplescenes project package in Examples" !578
+-   "Change the command GetPNGScreenshot to use ScreenCapture.CaptureScreenshot" !580
+-   "Refactor wait commands to use callback pattern" !586
+-   "CommandResponseTimeoutException is raised even if the driver is disconnected" !593
+-   "Add AUT+UTF example in the docs" !595
+-   "[API - BY-Selector] Update screenshot for AltId" !596
+-   "Tester dev documentation" !598
+-   "websocket server inside AltUnity Tester"	!600
+-   "Strong type return message on AltUnityObject commands"	!603
+-   "Update java dependencies" !604
+-   "[Java] forwardIos not working"	!605
+-   "[AltUnityRunnerPrefab] Incorrect message when another process is listening on the same port" !607
+-   "Docs for GetComponentProperty / SetComponentProperty"	!609
+-   "Include Samplescenes project package in Examples"	!610
+-   "Add known issue about portforwarding ios in mono" !611
+-   "CreateProperties and unhandled exception"	!612
+-   "Update docstrings for the public methods" !613
+-   "Add "Tester" in error message when Inspector cannot connect" !614
+-   "[Port Forwarding] [Windows] UI issues when port forwarding starts from AUT Editor"	!615
+-   "Modify GetScreenshot to send screenshot information as a png image" !617
+-   "Fix connection issue for python bindings" !616
+-   "[AltUnityRunnerPrefab] Wrong Tester version in popup when communication protocol is initiated"	!618
+-   "[Overview - How it works] Remove the Previous and Next buttons from screenshot" !619
+-   "Review java Driver library for consistency of api"	!622
+-   "Add information about code stripping in documentation"	!623
+-   "Update newtonsoft to v.10.0.1 netstandard1.3"	!626
+-   "Fix connection issue for python bindings" !628
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+
+# Changes in version 1.6.6
+
+## New
+
+-   "Input Handle Mouse events every frame" !467
+-   "Add CameraNotFound error handler" !477
+-   "Drag/Drop events for KeyUp / KeyDown" !483
+
+## Bug fixes and improvements
+
+-   "[Tests list] Case when Assembly-CSharp_editor.dll displays an extra number of selected tests and passed test icon" !482
+-   "[Unity - Game] Large AUT popup and icon for the Asset Store package" !481
+-   "Make menu item and window name for AUT editor the same" !471
+-   "Tests list missing for cloned game project from Gitlab" !479
+-   "Click method is not working" !476
+-   "Change the Selectors name with name used in syntax" !478
+-   "Eliminate note from "Write and execute first test" section" !475
+-   "Preselected build location path deleted after canceling to change it" !473
+-   "Fix inconsistencies in documentation" !472
+-   "SetComponentProperty doesn't set value for properties in a struct" !469
+-   "Add an x button to altunity popup, so it's more intuitive that it can be closed" !470
+-   "Problems with maven release job" !466
+-   "Pressing x button on the test report pop-up makes the pop-up reopen" !468
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+
+# Changes in version 1.6.5
+
+## New
+
+-   "Add new input press key command" #454
+-   "Add new input commands: begintouch, touchmove, endtouch" #564
+-   "simplify click & tap commands" #549
+
+## Bug fixes and improvements
+
+-   "Update API Documentation's examples using changed method signature" #552
+-   "Unity 2021 throws warning there are 2 eventSystems in the scene" #559
+-   "PointerEventData.pointerPressRaycast.gameObject missing when doing tap from tests" #503
+-   "Input action and show input are not finished when timescale is 0" #560
+-   "Scroll/ScrollAndWait method not working" #555
+-   "KeyDownLifeCycle does not raise events for Mouse1" #525
+-   "[Unity Editor - AltUnity Tools menu] UI issues in the AltUnity Inspector window" #511
+-   "Add license file to the Unity Asset Store" #568
+-   "Warnings in console after \"Play in Editor\"" #570
+-   "[AUT Editor] Display issues" #565
+-   "Move test list in a separate container" #539
+-   "[Swipe/SwipeAndWait] Object swiped only for value that exits the window border" #556
+-   "Swipe/SwipeAndWait method results into swiping always the same direction" #505
+-   "Make pressKey command in java and python consistent with c#" #508
+-   "update parameter names for python example in portforwarding" #546
+-   "AltUnityMockUpPointerInputModule monobehaviour instantiated with new" #519
+-   "[TesterEditorPage] Test cases are not selected in the test list when selecting test that uses TestCase" #528
+-   "[TesterEditorPage] Test name is not fully displayed when using test case" #529
+-   "Update python example with the latest port forwarding method" #541
+-   "Add CI job for linting python code" #506
+-   "UI issues on dropdowns in Editor" #543
+-   "Display Number of selected tests in AltUnityTesterEditor Test List" #540
+-   "[Editor] Add menu item to add and remove AltId from current loaded scene" #517
+-   "[Editor] Allow only one AltId per object" #518
+-   "[AltUnity Tester Editor] Misalignment of some UI elements" #548
+-   "Issue with Button.ClickEvent()" #163
+-   "Screenshot aspect ratio is not respected when entering larger size than the screenshot itself" #536
+-   "Check for an existing Assets/Resources directory before creating, to prevent creating an 'Assets/Resources 1' duplicate path." !424
+-   "Resolve deprecation warning on UnityWebRequest.isNetworkError, which was introduced in Unity 2020.2." !423
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+-   Frank Hickman @fhickman
+
+# Changes in version 1.6.4
+
+## Bug fixes and improvements
+
+-   "Path selector parsing and error handling" !408
+-   "Fix the python bindings packaging script" !409
+-   "FindObjects indexer does not take into account enabled false flag" !406
+-   "move mouse does not move to the right position" !412
+-   "fix for moving whole delta in last frame" !402
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+-   Andy @effalumper
+
+# Changes in version 1.6.3
+
+## New
+
+-   "Add Find By.ID support with ID component" !359
+-   "New command: unload scene" !373
+-   "Add possibility to have multiple selectors for an object in the path" !382
+-   "Add ability to set log level or turn logs off" !383
+-   "Selector By.Path Select N-th element" !358
+-   "Add AltUnityPortHandler to Nuget package" !367
+
+## Bug fixes and improvements
+
+-   "GetScreenshot command fails in Android Emulator" !392
+-   "Change WaitForObjectWithText to use the @text selector in the path" !387
+-   "document By.PATH with more examples" !376
+-   "CallComponentMethod with Optional Parameters methods does not work well when passing empty string" !388
+-   "AltUnityPortForwarding.ForwardIOS not working with no device id specified" !384
+-   "Python altElement transformId is misspelled 'tranformId' and its value is always 0" !379
+-   "Get object's coordinates without dedicated camera" !378
+-   "Add @text selector to be used in finding objects by path" !369
+-   "[Editor] Move/Add output field closer to build location" !375
+-   "Set logs limit from AltUnity editor window." !365
+-   "[Editor] Open build location once build is complete" !374
+-   "[Documentation] Update LoadScene Java example to use builder" !372
+-   "Remove AltPopIconDrag.cs from repository" !371
+-   "AltUnity Tester bug: EndLayoutGroup: BeginLayoutGroup must be called first" !368
+-   "Add namespace to AltUnity.Editor scripts" !353
+-   fix log overflow !364
+-   "Refactor Input LifeCycle methods" !362
+-   "Append tester version to the name of the unity package" !360
+-   "Add explanation in documentation about unity package download" !361
+-   "Make input script valid when ALTUNITYTESTER is not defined" !357
+-   "Implement GetAllActiveCameras" !354
+-   "Add example project for writing tests with C# nuget package" !352
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Dezmerean @robert-dezmerean
+-   Iuliana Todoran @iuliana.todoran
+-   Robert Poienar @robert_poienar
+-   Ochir Darmaev @ochirdarmaev
+
+# Changes in version 1.6.2
+
+## New
+
+-   "Publish altUnity on nuget" !328
+
+## Bug fixes and improvements
+
+-   "3D object disappears when highlighted for screenshot" !349
+-   "Add possibility to call a method from an object inside an gameObject" !348
+-   "parentId is wrong for canvas objects" !341
+-   "Click event is not triggered when swipe is moving but remains on the same object" !347
+-   "Wrong shaders are assigned to materials after object is highlighted" !346
+-   "call CreateJsonFileForInputMappingOfAxis during build from commandline" !343
+-   "Return value for CallStaticMethod is wrong in documentation" !342
+-   "Handle case when there is no camera selecting object from screenshot" !318
+-   "Keypress moves the character 2 positions instead of 1" !337
+-   "Remove tests requiring moq.dll from unitypackage" !340
+-   "AltElement repr does not conform to the standard in python" !339
+-   "Add flag to make sure AltUnity Tester can be added only to dev builds" !335
+-   "Add a note to documentation regarding that only dev builds should have AltUnity Tester" !334
+-   "Spelling mistake in AltUnityTester UI and documentation." !333
+-   "Add an overview to License section, so users are not confused what restrictions they have" !332
+-   "Port forwarding text has different color in dark theme than other text" !329
+-   "Iterate enabled cameras on HightlightObjectFromCoordinatesCommand" !330
+-   "Fix inspector documentation link" !326
+-   "Add documentation for selecting scenes when building the game"!325
+-   "Update AltUnity Tester documentation structure" !324
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Gombos Kriszta @GombosKriszta
+-   Robert Poienar @robert_poienar
+
+# Changes in version 1.6.1
+
+## Bug fixes and improvements
+
+-   Solved memory problems cause by Get/SetPixels !320
+-   Removed annoying Debug.LogError() !317
+-   Fixed logging exceptions !316
+-   Added link to AltUnityInspector !321
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Robert Poienar @robert_poienar
+
+# Changes in version 1.6.0
+
+## Bug fixes and improvements
+
+-   "Remove deprecated methods" !301
+-   "Fix AltUnitySyncCommand to receive until message id matches" !311
+-   AltUnityTapCommand. Add clickTime !288
+-   "GetAllLoadedScenesCommand return scene by build index and not by loaded scenes" !309
+-   Fix bug in GetAllLoadedScene !291
+-   "String is not considerate a primitive" !307
+-   "swipe and wait does not wait the expected duration because of float conversion" !306
+-   "add message id to driver server communication" !303
+-   "Input actions are not finished when timeScale is 0" !302
+-   "Wrong scale difference/original size of screenshot is sent" !300
+-   "Change AltUnityProperty and AltUnityField to be the same and add type field" !297
+-   "Add more control what fields should return get_all_fields" !267
+-   "Pressing mouse button doesn't click on buttons" !296
+-   "Display an error message If the port AltUnityServer listens to is used by another process" !295
+-   "If no size value is given for screenshot command then it should return full size screenshot" !294
+-   "Method to GetAllElements with minimal information" !293
+-   "GetComponentProperty sends errorNullRefferenceMessage instead of errorComponentNotFoundMessage" !292
+-   "Add try catch when transforming game object to altunityobject" !287
+-   "GetMemberForObjectComponent doesn't recognize all properties or fields" !286
+-   "Change command name from FindObjectWhichContains to FindObjectWhichContain" !264
+-   "Update retry logging in unity in AltUnityDriver" !275
+-   "Update gitignore to ignore more files that do not need to be in the repo" !284
+-   Update documentation
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Ru Cindrea @ru.cindrea
+-   pusoktimea @pusoktimea
+-   Alexandru Rotaru @alex.rotaru
+-   Raluca Vaida @raluca.vaida
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Poienar @robert_poienar
+-   SivanYakir @SivanYakir
+-   Ka3u6y6a @ka3u6y6a
+
+# Changes in version 1.5.7
+
+## Bug fixes and improvements
+
+-   "Remove null checker to make compatible with .net 3.x" !268
+-   "GetVersion should return server version when there is a mismatch" !266
+-   "Load scene additive" !265
+-   "AltUnityDriver python does not display warnings by default" !263
+-   Update documentation
+
+## Contributors
+
+-   Dorin Oltean @dorinaltom
+-   Ru Cindrea @ru.cindrea
+-   pusoktimea @pusoktimea
+-   Alexandru Rotaru @alex.rotaru
+-   Dorel @doreln
+-   Bogdan Birnicu @bogdan.birnicu
+-   Raluca Vaida @raluca.vaida
+-   Gombos Kriszta @GombosKriszta
+-   Andra Cardas @andra.cardas
+-   Robert Poienar @robert_poienar
+
+# Changes in version 1.5.6
+
+## Bug fixes and improvements
+
+-   "Make "Drag" and "Drop" command deprecated" !259
+-   "Make AltUnityDriver interface consistent across all language clients" !257
+-   "Add option to specific camera other than name in find objects commands" !207
+-   "Python - iOS - exception still thrown if we try to connect but server is not yet running" !255
+-   "click_element() not working in python" !254
+-   "Multiple warning messages displayed when using the editor" !252
+-   "Update documentation for overview and get started" !251
+-   "Test List doesn't appear when configuration page is created" !250
+-   "Double clicking on a test in AltUnity Tester window doesn't open the test file in IDE" !249
+-   "Make the Android / iOS options under Platform more clear" !248
+-   "Tilt command not working" !247
+-   Exposing the AltBaseSettings to support users to write custom commands. !253
+-   "AltElement in Python doesn't have parentId property" !238
+-   "Class name is checked although not all tests under it are checked (in the Tests list)" !237
+-   "Scroll command not functioning" !246
+-   "No relevant error message and build is not made when having empty "Output path"" !244
+-   "General Method to run c# test in command line" !242
+-   "Examples are missing from unity package that is in documentation" !239
+-   "Continuous error triggered when making changes to the test file while the game is running" !245
+-   ""NullReferenceException" displayed as info message after running tests" !243
+-   "Finding parent by path gives "failedToParseMethodArguments"" !228
+-   "Finding object by component should accept component name just like other methods" !241
+-   "Handle null exception in case object has null components(invalid scripts)" !208
+-   Added get_all_fields_of() for Python along with Typing help !232
+-   Test List Improvements !240
+-   Added get_all_components() for Python along with Typing help !231
+-   "AltUnityTesterEditorSettings should not appear in the project files" !236
+-   "Update example tests in order to avoid possible naming conflicts" !233
+-   "Rename some of the server commands all to respect the same pattern" !235
+-   "Move "Run tests" section below "Build" and "Run" sections" !234
+-   "Add example in documentation for function that are missing" !209
+-   Changed all the is to the ==, where python complained !230
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Dorin Oltean @dorinaltom
+-   Ru Cindrea @ru.cindrea
+-   pusoktimea @pusoktimea
+-   Alexandru Rotaru @alex.rotaru
+-   Dorel @doreln
+-   Bogdan Birnicu @bogdan.birnicu
+-   Raluca Vaida @raluca.vaida
+-   Mike Talalaevskiy @Day0Dreamer
+-   Miguel Ibero @miguel.ibero
+-   dcole-gsn @dcole-gsn
+
+# Changes in version 1.5.5
+
+## Bug fixes and improvements
+
+-   "Create in sample scene a button that load other scene and test it" !221
+-   "Add a way to control the amount of output" !222
+-   "Add option to set port in BuildGame Method and move to Awake runner instantiation settings" !213
+-   "Compile errors after adding 'ALTUNITYTESTER' in scripting define symbols" !210
+-   "Add Text and TextMeshPro Text component to SetText" !220
+-   "Add favicon to altom.gitlab.io" !223
+-   "If the server is not started when calling getServerVersion, it's stuck" !217
+-   "Add license information in documentation" !219
+-   "Add google groups links in documentation" !215
+-   "Move Bindings folder from BindingAndExample Folder" !214
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Ru Cindrea @ru.cindrea
+-   pusoktimea @pusoktimea
+-   Alexandru Rotaru @alex.rotaru
+-   Mike Talalaevskiy @Day0Dreamer
+
+# Changes in version 1.5.4
+
+## New
+
+-   Double tap method for AltUnityObject !190
+-   Add TapCustom command !194
+-   "Add AltUnity to Maven" !204
+
+## Bug fixes and improvements
+
+-   "C# receive method adds additional characters in the response" !206
+-   "Some elements to be highlighted are not found" !205
+-   "Screenshot with object highlighted not working for camera" !196
+-   "Return the object with the screenshot when given x y coordinates" !201
+-   "Add Tank Sample to documentation" !191
+-   "Change function name in python from click_Event to click_event" !200
+-   "Error when uploading to pypi the latest version" !193
+-   "Modify check version for earlier version that don't have the command to not throw an error" !199
+-   "Sort better the order how method are returned from getAllMethods command" !198
+-   "Make input visualizer pulsate when clicking" !189
+-   "Add information about communication between server and driver" !197
+-   "Add a note to Documentation about not having to rebuild the game when tests are changed" !192
+-   "Are there similar methods for HoldButton , HoldButtonAndWait and Send_keys in Python binding?" !184
+-   "Add javadoc to AltUnity tester" !203
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Ru Cindrea @ru.cindrea
+-   Ka3u6y6a @ka3u6y6a
+-   Andrei Ionut Benyi @ionut.benyi
+-   pusoktimea @pusoktimea
+-   Alexandru Rotaru @alex.rotaru
+
+# Changes in version 1.5.3
+
+## New
+
+-   Add methods for swipe by more then two points !173
+-   Server needs GetVersion() command" !172
+
+## Bug fixes and improvements
+
+-   Move tests that search for multiple object to another scene" !185
+-   Update ReadMe from project" !186
+-   Add java package in pages and bindings" !183
+-   Test in Python doesn't run at all" !177
+-   Error thrown for object name when Encoding/Decoding" !178
+-   Implement static `removePortForwarding` methods so that they don't remove all other existing ports that are forwarded" !167
+-   Add link to java examples documentation" !182
+-   adb path should be configurable on windows and should be part of Android (not iOS) Settings" !179
+-   Python bindings: missed install requirement - "deprecated" package" !180
+-   Add documentation for port forwarding for iOS and Android" !160
+-   Change class names to have prefix alt|altunity" !176
+-   If extension is not define in output path it will be set automatically !156
+-   AltUnityPopCanvas set to be in front and option to deactivate" !175
+-   Input axis not working if it not set all four values" !174
+-   Bug: null reference returned for object where parent is canvas with world space and no camera set" !169
+-   Update appium tests" !170
+-   Python bindings - port forwarding cannot be done if Appium is not used" !159
+-   HighlightSelectedObjectCommand should return "Ok" not "null"" !168
+-   Refresh port forwarding throws error" !166
+-   SetText doesn’t work for TextMeshPro components" !164
+-   DeviceId overlapping with Local Port Id" !165
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Ru Cindrea @ru.cindrea
+-   Ka3u6y6a @ka3u6y6a
+-   Andrei Ionut Benyi @ionut.benyi
+-   pusoktimea @pusoktimea
+-   Alexandru Rotaru @alex.rotaru
+
+# Changes in version 1.5.2
+
+## New
+
+-   Add option to activate input visualizer from AltUnityTester GUI !145
+-   Add options to disable pop-up from GUI !154
+-   Screenshot functionality for all 3 drivers !140
+
+## Bug fixes and improvements
+
+-   Find Objects doesn't find all objects !144
+-   ALTUNITYTESTER define symbol is not inserted at the right platform when playing in editor !155
+-   Add theme to documentation !147
+-   Error on python 2.7: TypeError super() takes at least 1 argument (0 given) !146
+-   Made IP change to accept all incoming connections to AltUnityServer, at... !151
+-   Add gitter link to documentation !152
+-   Fix java Wait for object not be present !150
+-   Fix click at coordinates on python !149
+-   wait_for_object fails !142
+-   Fix documentation title and broken links
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Ru Cindrea @ru.cindrea
+-   Thejus Krishna
+-   Ka3u6y6a @ka3u6y6a
+-   Raluca Vaida @raluca.vaida
+-   pusoktimea @pusoktimea
+-   Alexandru Rotaru @alex.rotaru
+
+# Changes in version 1.5.0
+
+## Refactoring
+
+-   Modify C# driver not to depend on Unity !131
+-   Project refactoring: Server !108
+-   Project refactoring: AltDriver(python) !113
+-   Project refactoring: AltDriver(Java) !115
+
+## New
+
+-   Add pop-up to AltUnityPrefab !106
+-   Add clicks visualization !122
+-   Add set text command !125
+-   Open file test when clicking on a test from window editor !118
+-   Create documentation in form of a wiki !128
+-   Get Server output !107
+
+## Bug fixes and improvements:
+
+-   Divide editor window to see better the content !119
+-   The method callComponentMethod was constructing an AltUnityObjectAction with...!109
+-   Server throw more generic error for getComponent than it used to !130
+-   Add test for Java method to callComponentMethod with assembly name too !111
+-   Correct obsolete texts in c# driver !123
+-   Update readme with correct url to download latest Unity package !116
+-   AltUnityTester - Create new AltUnity Test doesn't do anything !110
+-   Add command for getting text from ui text and text mesh pro !120
+-   Missing tests for getAllElement in python !134
+-   Missing tests for FindObjectWhichContains!135
+-   Add test for "inspector" commands c# !137
+-   Change tests to be independent of the screen resolution !129
+-   Missing command in c# driver: WaitForObjectWhichContains !124
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Ru Cindrea @ru.cindrea
+-   Ka3u6y6a @ka3u6y6a
+-   ricardo larrahondo @ricardorlg
+
+# Changes in version 1.4.0
+
+## Keyboard, joystick and mouse simulation
+
+-   Add keyboard input simulation !98
+-   Joystick controls !102
+
+## Bug fixes and improvements:
+
+-   Modify the project to use AssemblyQualifiedName instead of just class name" !97
+-   Make "Play in Editor" to open the first scene or to put the AltUnityTester in the active scene !100
+-   Fix AltUnityTestWindow when using AssemblyDefinitionFiles !99
+-   Add timeout to get_current_scene call during socket setup !94
+-   "setup_port_forwarding" method in runner.py file from python bindings is throwing an exception !95
+-   Set adbFileName in linux !93
+-   Fix ClickOnScreenAtXy !92
+-   driver.findElement is unable to find some elements in ver 1.3.0 !91
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Ru Cindrea @ru.cindrea
+-   Arthur @LordStuart
+
+# Changes in version 1.3.0
+
+## Improvements to Unity Editor GUI / AltUnityTester Unity Test Runner
+
+-   Connected devices and port forwarding status are shown in UI, more than one device can be used at a time - !81
+-   Command separator is configurable (from code and UI) - !79
+-   More build options - !77
+-   Improvements to test running finish dialog - !75, !82
+-   Ability to run tests in Editor - !55
+
+## Running in cloud
+
+-   Added documentation and example for running on AWS Device Farm - !20
+-   Fixed issue with port fowarding on iOS Python client that caused problems with running in Bitbar and AWS cloud - !76
+
+## Overall Refactoring:
+
+-   Split AltUnityTesterEditor and provide an interface for building a game with AltUnityTester on different platforms - !71
+-   Java refactoring and improvements - !60, !58
+
+## Release Artifacts:
+
+-   Create deployment to pages - !66
+-   Create AltUnityTester package for every branch via CI pipeline - !65
+
+## Bug fixes and improvements:
+
+-   WaitForElementToNotBePresent doesn't work correctly - !89
+-   IdProject is not created when Assets is not parent for AltUnityTester folder - !87
+-   Change appium methods duration variable name to be suggestive - !83
+-   NullREferenceException is returned when calling tapScreen twice - !74
+-   AltUnityRunnerPrefab is not removed when Run in Editor - !73
+-   Tester should work without any camera in the scene - !72
+-   Run failed test or selected will run all the test - !69
+-   Driver froze when the information receive is a certain size - !70
+-   Disable objects not found by FindObjects - !68
+-   Make AltUnityTester work with Unity 2017.x - !64
+-   Fix links in Java bindings readme - !62
+-   Update for Python Bindings runner.py - !61
+
+## New AltUnityRunner commands and features:
+
+-   (C# only) GetScreenshot command - !86, !78, !56, !54
+-   Add way to find elements that are not enabled - !50
+-   Add GetAllObjects(), GetAllMethods(), GetAllComponents, GetAllScenes(), GetAllProperties() commands, add way to find objects by IDs - !63, !59, !53, !51
+-   Add command to set Time.timeline - !85
+
+## Contributors
+
+-   Robert Poienar @robert_poienar
+-   Ru Cindrea @ru.cindrea
+-   Kamil @kaszarek
+-   Nikita Ershov @ershov1
+-   Napster @napstr
diff --git a/Docs/source/pages/faq-troubleshooting.md b/Docs/source/pages/faq-troubleshooting.md
index 548fbe481..3790256c4 100644
--- a/Docs/source/pages/faq-troubleshooting.md
+++ b/Docs/source/pages/faq-troubleshooting.md
@@ -147,7 +147,7 @@ After reopening Unity Editor, add again the AltTester package in your project.
 
 You get this error because you don't have the Input System (New) package. If you only want to use the Input Manager (Old) in your project, follow this steps:
 <br>
-- <strong>delete</strong>: 
+- <strong>delete</strong>:
     - `Assets\AltTester\AltServer\NewInputSystem.cs`
     - `Assets\AltTester\AltServer\AltKeyMapping.cs`
 - <strong>comment</strong> in `Assets\AltTester\AltServer\AltPrefabDrag.cs` the entire `#else` statement
@@ -161,7 +161,7 @@ You get this error because you don't have the Input System (New) package. If you
     ```
 - <strong>comment</strong> in `Assets\AltTester\AltServer\Input.cs`:
     - all imports for using `UnityEngine.InputSystem.UI`
-        ```   
+        ```
         #if ALTTESTER && ENABLE_LEGACY_INPUT_MANAGER
 
         using System;
@@ -175,7 +175,7 @@ You get this error because you don't have the Input System (New) package. If you
         using UnityEngine.EventSystems;
         // using UnityEngine.InputSystem.UI;
         using UnityEngine.Scripting;
-        ```  
+        ```
     - all `if` lines that contain `InputSystemUIInputModule` and the curly brackets inside these `if` statements making sure to leave the code inside the brackets uncommented
         ```
         // if (EventSystem.current.currentInputModule != null && EventSystem.current.currentInputModule.GetType().Name != typeof(InputSystemUIInputModule).Name)
@@ -188,7 +188,7 @@ You get this error because you don't have the Input System (New) package. If you
                     }
                 // }
         ```
-     
+
 - <strong>comment</strong> in `Assets\AltTester\AltServer\AltMockUpPointerInputModule.cs` the same as the above
 
 </details>
diff --git a/Assets/AltTester/license.md b/LICENSE
similarity index 98%
rename from Assets/AltTester/license.md
rename to LICENSE
index fb2261da2..672e447b3 100644
--- a/Assets/AltTester/license.md
+++ b/LICENSE
@@ -1,11 +1,3 @@
-# License
-
-AltTester is licensed under the GNU General Public License v3.0. This means that the end user has the freedom to use, share and modify the software.
-It's a copyleft license, which means that if any derivative work must be distributed, it should be distributed under the same or equivalent license terms.
-As long as it's added to the development build and not distributed, it has no restrictions for the end user.
-
-## License text
- 
                      GNU GENERAL PUBLIC LICENSE
                        Version 3, 29 June 2007
 
@@ -76,7 +68,7 @@ patents cannot be used to render the program non-free.
   The precise terms and conditions for copying, distribution and
 modification follow.
 
-**TERMS AND CONDITIONS**
+                       TERMS AND CONDITIONS
 
   0. Definitions.
 
@@ -626,9 +618,9 @@ an absolute waiver of all civil liability in connection with the
 Program, unless a warranty or assumption of liability accompanies a
 copy of the Program in return for a fee.
 
-**END OF TERMS AND CONDITIONS**
+                     END OF TERMS AND CONDITIONS
 
-## How to Apply These Terms to Your New Programs
+            How to Apply These Terms to Your New Programs
 
   If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
@@ -639,7 +631,7 @@ to attach them to the start of each source file to most effectively
 state the exclusion of warranty; and each file should have at least
 the "copyright" line and a pointer to where the full notice is found.
 
-    Copyright (C) 2020  Altom Consulting
+    Copyright (C) 2022  Altom Consulting
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -659,7 +651,7 @@ Also add information on how to contact you by electronic and paper mail.
   If the program does terminal interaction, make it output a short
 notice like this when it starts in an interactive mode:
 
-    Copyright (C) 2020  Altom Consulting  
+    Copyright (C) 2022  Altom Consulting
     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type `show c' for details.
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..eb3a47075
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+# AltTester Unity SDK
+
+AltTester Unity SDK is an open-source UI driven test automation tool that helps you find objects in your application and interacts with them using tests written in C#, Python or Java.
+
+## Documentation
+
+Our documentation is available here:
+
+* https://alttester.com/docs/sdk/
+
+## Support
+
+* Join our Discord Server: https://discord.gg/Ag9RSuS
+* Join our Google Group for questions and discussions: https://groups.google.com/a/altom.com/g/alttesterforum
+
+## Development Setup
+
+### Build a Unity package from source
+
+1. Open your project in Unity.
+1. From `AltTester` menu choose `Create AltTester Package`.
+1. See the created unity package under the project.
+
+## Contributing
+
+Check out the full contributing guide [here](https://alttester.com/docs/sdk/pages/contributing.html).
+
+## License
+
+Distributed under the **GNU General Public License v3.0**. See [LICENSE](https://github.com/alttester/AltTester-Unity-SDK/blob/master/LICENSE) for more information.
+
+This project is tested with [BrowserStack](https://www.browserstack.com/).


Test patch:
diff --git a/Bindings~/python/alttester/altdriver.py b/Bindings~/python/alttester/altdriver.py
index adfaab5eb..552152055 100644
--- a/Bindings~/python/alttester/altdriver.py
+++ b/Bindings~/python/alttester/altdriver.py
@@ -59,6 +59,7 @@ def __init__(self, host="127.0.0.1", port=13000, app_name="__default__", enable_
             notification_handler=self._notification_handler
         )
         self._connection.connect()
+        self._check_server_version()
 
     def __repr__(self):
         return "{}({!r}, {!r}, {!r}, {!r}, {!r})".format(