diff --git a/QtBlocksetPSP-R2019b_v2.1.3_win64-Install.exe b/QtBlocksetPSP-R2019b_v2.1.3_win64-Install.exe
new file mode 100644
index 0000000000000000000000000000000000000000..53938b7eb69bff6627889a0cd540f1826a4787d0
Binary files /dev/null and b/QtBlocksetPSP-R2019b_v2.1.3_win64-Install.exe differ
diff --git a/README.md b/README.md
index a3982079840bd5766ffbcbe6728ba12556d936ef..091cab1db20531ad1b26c59200425411bae97a4f 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
-# Simulink plugin dependencies
+This repository contains dependencies needed by the simulink connector plugin (https://git.qt.io/mbadri/simulinkconnector). Dependencies are provided by MathWorks (mathworks.com).
 
-Simulink dependency lib and Qt blockset. Those 2 items are needed for the integration between Simulink and a Qt/Qt Design studio app.
\ No newline at end of file
+The package is composed of three components:
+1) Simulink Qt Block Library (QtBlocksetPSP-R2019b_v2.1.3_win64-Install.exe)
+2) Qt plugin (simulinkplugin) for connectivity to the Simulink environment using C++
+3) QML Extension plugin (simulinkqmlplugin) which allows the simulinkplugin to be used in QML directly. 
\ No newline at end of file
diff --git a/msvc2019/simulinkplugin.dll b/msvc2019/simulinkplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..47611a06a8a46c312ed5ec7260be2440a8bc4fa7
Binary files /dev/null and b/msvc2019/simulinkplugin.dll differ
diff --git a/msvc2019/simulinkplugin.exp b/msvc2019/simulinkplugin.exp
new file mode 100644
index 0000000000000000000000000000000000000000..67184e36fd9b5eb12c7a911869fdbc862b6334a7
Binary files /dev/null and b/msvc2019/simulinkplugin.exp differ
diff --git a/msvc2019/simulinkplugin.h b/msvc2019/simulinkplugin.h
new file mode 100644
index 0000000000000000000000000000000000000000..6cca6c2e6b9e499abd530dc3f58168864d4030e5
--- /dev/null
+++ b/msvc2019/simulinkplugin.h
@@ -0,0 +1,339 @@
+/****************************************************************************
+** Copyright 2015-2017 The Mathworks, Inc.
+*****************************************************************************/
+
+/****************************************************************************
+** Copyright (c) 2006 - 2011, the LibQxt project.
+** See the Qxt AUTHORS file for a list of authors and copyright holders.
+** All rights reserved.
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+**     * Redistributions of source code must retain the above copyright
+**       notice, this list of conditions and the following disclaimer.
+**     * Redistributions in binary form must reproduce the above copyright
+**       notice, this list of conditions and the following disclaimer in the
+**       documentation and/or other materials provided with the distribution.
+**     * Neither the name of the LibQxt project nor the
+**       names of its contributors may be used to endorse or promote products
+**       derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+**
+** <http://libqxt.org>  <foundation@libqxt.org>
+*****************************************************************************/
+
+#ifndef SIMULINKPLUGIN_H
+#define SIMULINKPLUGIN_H
+
+#include <QObject>
+#include <QList>
+#include <QVariant>
+#include <QPair>
+#include <QString>
+#include <QHostAddress>
+
+#if defined(BUILD_SLQT_CORE)
+#    define SLQT_CORE_EXPORT Q_DECL_EXPORT
+#elif defined(BUILD_SLQT_QMLPLUGIN)
+#    define SLQT_CORE_EXPORT
+#else
+#    define SLQT_CORE_EXPORT Q_DECL_IMPORT
+#endif
+
+
+class  SimulinkPluginPrivate;
+
+class SLQT_CORE_EXPORT SimulinkPlugin : public QObject
+{
+Q_OBJECT
+
+public:
+    /*!
+     * Class SimulinkPlugin
+     * The SimulinkPlugin class transmits Qt signals over a QIODevice
+     *
+     * SimulinkPlugin is a tool that encapsulates Qt signals and transmits them over a QIODevice to a
+     * Simulink client.
+     *
+     * SimulinkPlugin can act as a client or a server. When acting as a server, it uses a
+     * SlQtAbstractConnectionManager to accept connections. When acting as a client, the application
+     * should provide an already-connected QIODevice to the setDevice() function.
+     *
+     * Due to a restriction of Qt's signals and slots mechanism, the number of parameters that can be
+     * passed to call() and its related functions, as well as the number of parameters to any signal
+     * or slot connected to SimulinkPlugin, is limited to 8.
+     */
+    SimulinkPlugin(QObject* parent = 0);
+    SimulinkPlugin(QList<QObject *> interfaces, QObject* parent = 0 );
+    SimulinkPlugin(QIODevice* device, QObject* parent = 0);
+    virtual ~SimulinkPlugin();
+
+    /*!
+     * Returns true if the connection manager is accepting connections or if any clients are
+     * currently connected. It is possible for both isServer() and isClient() to return false
+     * if the connection manager is not accepting connections, no clients are connected, and no
+     * QIODevice is set for a server.
+     * See also: isClient()
+     */
+    Q_INVOKABLE bool isServer() const;
+
+    /*!
+     * Returns true if the SimulinkPlugin is currently communicating with a server. It is possible
+     * for both isServer()and isClient() to return false if the connection manager is not accepting
+     * connections, no clients are connected, and no QIODevice is set for a server.
+     * See also: isServer()
+     */
+    Q_INVOKABLE bool isClient() const;
+
+    /*!
+     * Returns a list of client IDs for all connected clients.
+     */
+    QList<quint64> clients() const;
+
+    /*!
+     * When operating as a client, returns the QIODevice connected to the server.
+     * When operating as a server, or if not connected to a server, returns NULL.
+     * See also: setDevice()
+     * See also: takeDevice()
+     */
+    QIODevice* getdevice() const;
+
+    /*!
+     * Begins communicating with a server through the provided QIODevice dev. If called while
+     * acting as a server, this function is ignored with a warning. If called while another device
+     * is set, the original QIODevice is deleted. The provided device will be reparented to the
+     * SimulinkPlugin.
+     *
+     * Note that because QIODevice is a generic interface, SimulinkPlugin cannot provide signals
+     * when this device is disconnected or has low-level errors. Connect to the QIODevice subclass's
+     * signals directly if you need this information.
+     * See also: device()
+     */
+    void setDevice(QIODevice* dev);
+
+    /*!
+     * When operating as a client, returns the QIODevice used to communicate with the server. After
+     * this function is called, the SimulinkPlugin will no longer be connected and device() will
+     * return NULL. When operating as a server, or if not connected to a server, this function
+     * returns NULL without any other effect.
+     * See also: device()
+     */
+    QIODevice* takeDevice();
+
+    /*!
+     * Connects to the specified server addr on the selected port.
+     * When the connection is complete, the connectedToServer() signal will be emitted.  If an error
+     * occurs, the serverError() signal will be emitted.
+     */
+
+    void connect(QHostAddress addr, int port = 80);
+
+    /*!
+     * Connects to the specified peer or server addr on the selected port.
+     * When the connection is complete, the connectedToServer() signal will be emitted.  If an
+     * error occurs, the serverError() signal will be emitted.
+     */
+    Q_INVOKABLE void connect(QString addr, int port = 80);
+
+    /*!
+     * Listens on the specified interface iface on the specified port for connections.
+     *
+     * Attempting to listen while in Client mode or while connected in Peer mode will be ignored
+     * with a warning. In Peer mode, only one connection can be active at a time. Additional
+     * incoming connections while connected to a peer will be dropped. When a peer connects,
+     * the peerConnected()signal will be emitted. In Server mode, multiple connections can be
+     * active at a time. Each client that connects will be provided a unique ID, included in the
+     * clientConnected() signal that will be emitted. Returns true if succeeds, false otherwise.
+     */
+    Q_INVOKABLE bool listen(QString iface="", int port = 80);
+
+    /*!
+     * Stops listening for connections. Any connections still open will remain connected.
+     */
+    Q_INVOKABLE void stopListening();
+
+    /*!
+     * Binds all Signals, Slots, and Properties in parent with proper suffix naming convention
+     * to connected network channel.
+     */
+    Q_INVOKABLE bool autoConnect(QObject *parent);
+
+    /*!
+     * Binds all Signals, Slots, and Properties in interface with proper suffix naming convention
+     * to connected network channel.
+     *
+     * For Slots, the arguments should be QVariant type.
+     */
+    Q_INVOKABLE bool autoConnect(QList<QObject *> interface);
+
+
+    /*!
+     * Binds the slot in recv to the Simulink channel rpcFunction.
+     *
+     * When a signal with the name given by rpcFunction is received from the network, the connected
+     * slot is executed. Use the SLOT() macro to specify the slot, just as you would for QObject::connect().
+     *
+     * Like QObject::connect(), connectSlot() returns false if the connection cannot be established.
+     * Also like QObject::connect(), a signal may be used as a slot; invocation will cause the signal
+     * to be emitted.
+     *
+     * Arguments of the Slot should be QVariant type.
+     */
+    bool connectSlot(const QString& rpcFunction, QObject* recv, const char* slot,
+                     Qt::ConnectionType type = Qt::AutoConnection);
+
+    /*!
+     * Connects the given signal in sender to the Simulink channel rpcFunction.
+     *
+     * When the connected signal is emitted by sender, it will be transmitted to all connected servers,
+     *  clients, or peers. If an optional rpcFunction is provided, it will be used in place of the name
+     * of the transmitted signal. Use the SIGNAL() macro to specify the signal, just as you would for
+     * QObject::connect().
+     *
+     * Like QObject::connect(), connectSignal() returns false if the connection cannot be established.
+     */
+    bool connectSignal(QObject* sender, const char* signal, const QString& rpcFunction = QString());
+
+    /*!
+     * Binds the propert propName in recv to a Simulink channel with the same name.
+     *
+     * When a Property with the name given by rpcFunction is received from the network, the connected
+     * property is updated.
+     *
+     * Like QObject::connect(), connectProperty() returns false if the connection cannot be established.
+     *
+     */
+    bool connectProperty(QObject* recv, const char* propName,
+                         Qt::ConnectionType type = Qt::AutoConnection);
+
+    /*!
+     * Disconnects all signals for the given object obj.
+     */
+    void disconnectSignals(QObject* obj);
+
+    /*!
+     * Disconnects all slots for the given object obj.
+     */
+    void disconnectSlots(QObject* obj);
+
+    /*!
+     * Disconnects all Properties for the given object obj.
+     */
+    void disconnectProperties(QObject* obj);
+
+    /*!
+     * Disconnects all signals and slots for the given object obj.
+     */
+    void disconnectObject(QObject* obj);
+
+    /*!
+     * Sends the signal fn with the given parameter list to the server, or to all connected clients.
+     *
+     * The receiver is not obligated to act upon the signal. If no clients are connected, and if not
+     * communicating with a server, this function does nothing.
+     */
+    void call(QString fn, const QVariant& p1 = QVariant(), const QVariant& p2 = QVariant(),
+              const QVariant& p3 = QVariant(), const QVariant& p4 = QVariant(), const QVariant& p5 = QVariant(),
+              const QVariant& p6 = QVariant(), const QVariant& p7 = QVariant(), const QVariant& p8 = QVariant());
+    /*!
+     * Sends the signal fn with the given parameter list to the provided list of clients.
+     *
+     * The receivers are not obligated to act upon the signal. If no client is connected with a
+     * provided ID, the ID is ignored with a warning. If acting as a client, this function does nothing.
+     */
+    void call(QList<quint64> ids, QString fn, const QVariant& p1 = QVariant(), const QVariant& p2 = QVariant(),
+              const QVariant& p3 = QVariant(), const QVariant& p4 = QVariant(), const QVariant& p5 = QVariant(),
+              const QVariant& p6 = QVariant(), const QVariant& p7 = QVariant(), const QVariant& p8 = QVariant());
+    /*!
+     * Sends the signal fn with the given parameter list to the specified client.
+     *
+     * The receiver is not obligated to act upon the signal. If no client with the given ID is connected,
+     * the call will be ignored with a warning. If acting as a client, this function does nothing.
+     */
+    void call(quint64 id, QString fn, const QVariant& p1 = QVariant(), const QVariant& p2 = QVariant(),
+              const QVariant& p3 = QVariant(), const QVariant& p4 = QVariant(), const QVariant& p5 = QVariant(),
+              const QVariant& p6 = QVariant(), const QVariant& p7 = QVariant(), const QVariant& p8 = QVariant());
+    /*!
+     * Sends the signal fn with the given parameter list to all connected clients except for the client
+     * specified.
+     *
+     * The receiver is not obligated to act upon the signal. This function is useful for rebroadcasting a signal from one
+     * client to all other connected clients. If acting as a client, this function does nothing.
+     */
+    void callExcept(quint64 id, QString fn, const QVariant& p1 = QVariant(), const QVariant& p2 = QVariant(),
+                    const QVariant& p3 = QVariant(), const QVariant& p4 = QVariant(), const QVariant& p5 = QVariant(),
+                    const QVariant& p6 = QVariant(), const QVariant& p7 = QVariant(), const QVariant& p8 = QVariant());
+
+public Q_SLOTS:
+    /*!
+     * Disconnects a client with id using the connected connection manager.
+     * If connected to a server, this function is ignored with a warning.
+     */
+    void disconnectClient(quint64 id);
+
+    /*!
+     * Disconnects from the server. The QIODevice is deleted. Use takeDevice() to disconnect from the
+     * server without deleting the device.
+     *
+     * If not connected to a server, for instance if acting as a server, this function is ignored with
+     * a warning.
+     * See also: device()
+     * See also: takeDevice()
+     */
+    void disconnectServer();
+
+    /*!
+     * Disconnects all clients, or disconnects from the server.
+     */
+    void disconnectAll();
+
+    /*!
+     * Disconnects all signals and slots for the object that emitted the signal connected to
+     * disconnectSender().
+     */
+    void disconnectSender();
+
+Q_SIGNALS:
+    /*!
+     * This signal is emitted after a successful connection from a client.
+     *
+     * The given ID is used for disconnectClient(), call(), and related functions.
+     */
+    void clientConnected(quint64 id);
+
+    /*!
+     * This signal is emitted when a client disconnects. The given ID is no longer valid.
+     */
+    void clientDisconnected(quint64 id);
+
+    /*!
+     * This signal is emitted after a successful connection to a server.
+     */
+    void connectedToServer();
+
+    /*!
+     * This signal is emitted after disconnecting from a server.
+     */
+    void disconnectedFromServer();
+
+    /*!
+     * This signal is emitted if an error occurs on the socket connected to the server.
+     */
+    void serverError(QAbstractSocket::SocketError);
+
+protected:
+    Q_DECLARE_PRIVATE(SimulinkPlugin)
+    SimulinkPluginPrivate * const d_ptr;
+
+};
+#endif
diff --git a/msvc2019/simulinkplugin.lib b/msvc2019/simulinkplugin.lib
new file mode 100644
index 0000000000000000000000000000000000000000..4cf58b6fedf19c1e9ad1bac5446fb125a2c252e1
Binary files /dev/null and b/msvc2019/simulinkplugin.lib differ
diff --git a/msvc2019/simulinkqmlplugin.dll b/msvc2019/simulinkqmlplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..ff63b83c030b8e2090177bfca4450c40aed08f76
Binary files /dev/null and b/msvc2019/simulinkqmlplugin.dll differ
diff --git a/msvc2019/simulinkqmlplugin.exp b/msvc2019/simulinkqmlplugin.exp
new file mode 100644
index 0000000000000000000000000000000000000000..6d7d12e6405712a58e32a4610facf17f7cbd4fb9
Binary files /dev/null and b/msvc2019/simulinkqmlplugin.exp differ
diff --git a/msvc2019/simulinkqmlplugin.lib b/msvc2019/simulinkqmlplugin.lib
new file mode 100644
index 0000000000000000000000000000000000000000..0a740ff8998cc3c36b5efd2c18989dc33bd49642
Binary files /dev/null and b/msvc2019/simulinkqmlplugin.lib differ