diff --git a/AUTHORS b/AUTHORS
new file mode 100644
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,13 @@
+Maintainers
+-----------
+
+- Toralf Wittner <tw@dtex.org>
+
+Original Authors
+----------------
+
+- Toralf Wittner <tw@dtex.org>
+- Roman S. Borschel <roman.borschel@googlemail.com>
+
+Contributors
+------------
diff --git a/AUTHORS.txt b/AUTHORS.txt
deleted file mode 100644
--- a/AUTHORS.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Maintainers
------------
-
-- Toralf Wittner <tw@dtex.org>
-
-Original Authors
-----------------
-
-- Toralf Wittner <tw@dtex.org>
-- Roman S. Borschel <roman.borschel@googlemail.com>
-
-Contributors
-------------
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,35 @@
+3.1.0
+-----
+- Bugfix: Previous versions used an encoding for `CqlVarInt`
+  and `CqlDecimal` which is *incompatible* with the actual CQL binary
+  protocol specification. If you want to continue using the previous
+  encoding use `-f incompatible-varint` when building this release.
+- The `Keyspace` parameter was removed from `UdtColumn` (for details
+  see https://gitlab.com/twittner/cql/merge_requests/2)
+
+3.0.7
+-----
+- Bugfix release. Fixes UDT and tuple serialisation.
+
+3.0.6
+-----
+- Update `cereal` upper bound.
+
+3.0.5
+-----
+- Add `Row` type to represent dynamic query parameters
+  and results (e.g. to run "lightweight transactions"
+  which may yield different results)
+
+3.0.4
+-----
+- Update `iproute` upper bound
+- Handle `SockAddrCan` from network >= 2.6.1
+
+3.0.3
+-----
+- Update `iproute` upper bound
+
+3.0.2
+-----
+- Add support for GHC 7.10.1
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
deleted file mode 100644
--- a/CHANGELOG.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-3.0.7
------
-- Bugfix release. Fixes UDT and tuple serialisation.
-
-3.0.6
------
-- Update `cereal` upper bound.
-
-3.0.5
------
-- Add `Row` type to represent dynamic query parameters
-  and results (e.g. to run "lightweight transactions"
-  which may yield different results)
-
-3.0.4
------
-- Update `iproute` upper bound
-- Handle `SockAddrCan` from network >= 2.6.1
-
-3.0.3
------
-- Update `iproute` upper bound
-
-3.0.2
------
-- Add support for GHC 7.10.1
diff --git a/CONTRIBUTING b/CONTRIBUTING
new file mode 100644
--- /dev/null
+++ b/CONTRIBUTING
@@ -0,0 +1,20 @@
+Thank you for your interest in this project!
+
+Unless you explicitly state otherwise, any contribution intentionally
+submitted for inclusion in the software by you shall be under the terms
+and conditions of the Free Public License 1.0.0, without any additional
+terms or conditions.
+
+If you agree to the above and you can certify that your contribution
+was created in whole or in part by you and that you have the right to
+submit it under the Free Public License 1.0.0, then add a line saying
+
+
+    Signed-off-by: Your real name <your e-mail address>
+
+
+to your contribution.
+
+For details in regards to the Free Public License read the file LICENSE
+or visit https://opensource.org/licenses/FPL-1.0.0
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,47 @@
+Free Public License 1.0.0
+
+Permission to use, copy, modify, and/or distribute this software for
+any purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE
+FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+=============================================================================
+
+Cereal License
+
+Copyright (c) Lennart Kolmodin, Galois, Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. 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.
+
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE 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 THE AUTHORS OR CONTRIBUTORS 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.
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
--- a/LICENSE.txt
+++ /dev/null
@@ -1,409 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
-
-=============================================================================
-
-Cereal License
-
-Copyright (c) Lennart Kolmodin, Galois, Inc.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-
-2. 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.
-
-3. Neither the name of the author nor the names of his contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE 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 THE AUTHORS OR CONTRIBUTORS 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.
-
diff --git a/README.asciidoc b/README.asciidoc
deleted file mode 100644
--- a/README.asciidoc
+++ /dev/null
@@ -1,13 +0,0 @@
-= CQL Binary Protocol Implementation
-
-// URL references
-:cql2: https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v2.spec[2]
-:cql3: https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v3.spec[3]
-
-// Badges
-image:https://img.shields.io/badge/license-MPL_2.0-blue.svg["License: MPL-2.0", link="https://www.mozilla.org/MPL/2.0/"]
-image:https://travis-ci.org/twittner/cql.svg?branch=develop["Build Status", link="https://travis-ci.org/twittner/cql"]
-
-This Haskell library implements Cassandra's CQL Binary Protocol versions
-{cql2} and {cql3}. It provides encoding and decoding functionality as well
-as representations of the various protocol related types.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+CQL Binary Protocol Implementation
+==================================
+
+This Haskell library implements Cassandra's CQL Binary Protocol versions
+[2] and [3]. It provides encoding and decoding functionality as well
+as representations of the various protocol related types.
+
+Contributing
+------------
+
+If you want to contribute to this project please read the file
+CONTRIBUTING first.
+
+[2]: https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v2.spec
+[3]: https://github.com/apache/cassandra/blob/trunk/doc/native_protocol_v3.spec
diff --git a/cql.cabal b/cql.cabal
--- a/cql.cabal
+++ b/cql.cabal
@@ -1,20 +1,21 @@
 name:                 cql
-version:              3.0.7
+version:              3.1.0
 synopsis:             Cassandra CQL binary protocol.
 stability:            experimental
-license:              MPL-2.0
-license-file:         LICENSE.txt
+license:              OtherLicense
+license-file:         LICENSE
 author:               Toralf Wittner, Roman S. Borschel
 maintainer:           Toralf Wittner <tw@dtex.org>
 copyright:            (C) 2014-2015 Toralf Wittner, Roman S. Borschel
-homepage:             https://github.com/twittner/cql/
-bug-reports:          https://github.com/twittner/cql/issues
+homepage:             https://gitlab.com/twittner/cql/
+bug-reports:          https://gitlab.com/twittner/cql/issues
 category:             Database
 build-type:           Simple
 cabal-version:        >= 1.10
-extra-source-files:   README.asciidoc
-                      CHANGELOG.txt
-                      AUTHORS.txt
+extra-source-files:   README.md
+                      CHANGELOG
+                      CONTRIBUTING
+                      AUTHORS
 
 description:
     Implementation of Cassandra's CQL Binary Protocol
@@ -28,9 +29,13 @@
     Thus it can serve as a building block for writing Cassandra drivers, such
     as <http://hackage.haskell.org/package/cql-io cql-io>.
 
+flag incompatible-varint
+    description: Use incompatible legacy encoding for varint and decimal.
+    default: False
+
 source-repository head
-    type:             git
-    location:         git@github.com:twittner/cql.git
+    type:     git
+    location: https://gitlab.com/twittner/cql
 
 library
     default-language: Haskell2010
@@ -52,19 +57,22 @@
         Database.CQL.Protocol.Request
         Database.CQL.Protocol.Response
 
+    if flag(incompatible-varint)
+        cpp-options: -DINCOMPATIBLE_VARINT
+
     build-depends:
           base             >= 4.5    && < 5.0
-        , bytestring       >= 0.10   && < 1.0
-        , cereal           >= 0.3    && < 1.0
-        , Decimal          >= 0.3    && < 1.0
-        , iproute          >= 1.3    && < 2.0
-        , network          >= 2.4    && < 3.0
-        , text             >= 0.11   && < 2.0
+        , bytestring       >= 0.10
+        , cereal           >= 0.3
+        , Decimal          >= 0.3
+        , iproute          >= 1.3
+        , network          >= 2.4
+        , text             >= 0.11
         , template-haskell
-        , time             >= 1.4    && < 2.0
-        , transformers     >= 0.3    && < 0.5
-        , uuid             >= 1.2.6  && < 2.0
-        , vector           >= 0.10   && < 1.0
+        , time             >= 1.4
+        , transformers     >= 0.3
+        , uuid             >= 1.2.6
+        , vector           >= 0.10
 
 test-suite cql-tests
     type:             exitcode-stdio-1.0
diff --git a/src/Database/CQL/Protocol.hs b/src/Database/CQL/Protocol.hs
--- a/src/Database/CQL/Protocol.hs
+++ b/src/Database/CQL/Protocol.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 -- | The CQL native protocol is a binary frame-based protocol where
 -- each frame has a 'Header', a 'Length' and a body. The protocol
 -- distinguishes 'Request's and 'Response's.
diff --git a/src/Database/CQL/Protocol/Class.hs b/src/Database/CQL/Protocol/Class.hs
--- a/src/Database/CQL/Protocol/Class.hs
+++ b/src/Database/CQL/Protocol/Class.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE FlexibleInstances   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
diff --git a/src/Database/CQL/Protocol/Codec.hs b/src/Database/CQL/Protocol/Codec.hs
--- a/src/Database/CQL/Protocol/Codec.hs
+++ b/src/Database/CQL/Protocol/Codec.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE BangPatterns      #-}
 {-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -56,14 +52,12 @@
     , encodeOpCode
     , decodeOpCode
 
-    , encodeColumnType
-    , decodeColumnType
-
     , encodePagingState
     , decodePagingState
 
     , decodeKeyspace
     , decodeTable
+    , decodeColumnType
     , decodeQueryId
 
     , putValue
@@ -77,7 +71,11 @@
 import Data.Decimal
 import Data.Int
 import Data.IP
+#ifdef INCOMPATIBLE_VARINT
 import Data.List (unfoldr)
+#else
+import Data.List (foldl')
+#endif
 import Data.Text (Text)
 import Data.UUID (UUID)
 import Data.Word
@@ -356,36 +354,6 @@
 ------------------------------------------------------------------------------
 -- ColumnType
 
-encodeColumnType :: Putter ColumnType
-encodeColumnType (CustomColumn x)   = encodeShort 0x0000 >> encodeString x
-encodeColumnType AsciiColumn        = encodeShort 0x0001
-encodeColumnType BigIntColumn       = encodeShort 0x0002
-encodeColumnType BlobColumn         = encodeShort 0x0003
-encodeColumnType BooleanColumn      = encodeShort 0x0004
-encodeColumnType CounterColumn      = encodeShort 0x0005
-encodeColumnType DecimalColumn      = encodeShort 0x0006
-encodeColumnType DoubleColumn       = encodeShort 0x0007
-encodeColumnType FloatColumn        = encodeShort 0x0008
-encodeColumnType IntColumn          = encodeShort 0x0009
-encodeColumnType TextColumn         = encodeShort 0x000A
-encodeColumnType TimestampColumn    = encodeShort 0x000B
-encodeColumnType UuidColumn         = encodeShort 0x000C
-encodeColumnType VarCharColumn      = encodeShort 0x000D
-encodeColumnType VarIntColumn       = encodeShort 0x000E
-encodeColumnType TimeUuidColumn     = encodeShort 0x000F
-encodeColumnType InetColumn         = encodeShort 0x0010
-encodeColumnType (MaybeColumn x)    = encodeColumnType x
-encodeColumnType (ListColumn x)     = encodeShort 0x0020 >> encodeColumnType x
-encodeColumnType (MapColumn  x y)   = encodeShort 0x0021 >> encodeColumnType x >> encodeColumnType y
-encodeColumnType (SetColumn  x)     = encodeShort 0x0022 >> encodeColumnType x
-encodeColumnType (TupleColumn xs)   = encodeShort 0x0031 >> mapM_ encodeColumnType xs
-encodeColumnType (UdtColumn k n xs) = do
-    encodeShort 0x0030
-    encodeString (unKeyspace k)
-    encodeString n
-    encodeShort (fromIntegral (length xs))
-    forM_ xs $ \(x, t) -> encodeString x >> encodeColumnType t
-
 decodeColumnType :: Get ColumnType
 decodeColumnType = decodeShort >>= toType
   where
@@ -409,9 +377,12 @@
     toType 0x0020 = ListColumn  <$> (decodeShort >>= toType)
     toType 0x0021 = MapColumn   <$> (decodeShort >>= toType) <*> (decodeShort >>= toType)
     toType 0x0022 = SetColumn   <$> (decodeShort >>= toType)
-    toType 0x0030 = UdtColumn   <$> (Keyspace <$> decodeString) <*> decodeString <*> do
-        n <- fromIntegral <$> decodeShort
-        replicateM n ((,) <$> decodeString <*> (decodeShort >>= toType))
+    toType 0x0030 = do
+        _ <- decodeString -- Keyspace (not used by this library)
+        t <- decodeString -- Type name
+        UdtColumn t <$> do
+            n <- fromIntegral <$> decodeShort
+            replicateM n ((,) <$> decodeString <*> (decodeShort >>= toType))
     toType 0x0031 = TupleColumn <$> do
         n <- fromIntegral <$> decodeShort
         replicateM n (decodeShort >>= toType)
@@ -424,7 +395,7 @@
 encodePagingState (PagingState s) = encodeBytes s
 
 decodePagingState :: Get (Maybe PagingState)
-decodePagingState = liftM PagingState <$> decodeBytes
+decodePagingState = fmap PagingState <$> decodeBytes
 
 ------------------------------------------------------------------------------
 -- Value
@@ -476,17 +447,17 @@
         putWord32host b
         putWord32host c
         putWord32host d
-putNative _ (CqlVarInt x)    = integer2bytes x
-putNative _ (CqlDecimal x)   = do
+putNative _ (CqlVarInt x)   = integer2bytes x
+putNative _ (CqlDecimal x)  = do
     put (fromIntegral (decimalPlaces x) :: Int32)
     integer2bytes (decimalMantissa x)
-putNative V3 (CqlUdt  x)     = putByteString $ runPut (mapM_ (putValue V3 . snd) x)
-putNative V2 v@(CqlUdt  _)   = fail $ "putNative: udt: " ++ show v
-putNative _ v@(CqlList  _)   = fail $ "putNative: collection type: " ++ show v
-putNative _ v@(CqlSet   _)   = fail $ "putNative: collection type: " ++ show v
-putNative _ v@(CqlMap   _)   = fail $ "putNative: collection type: " ++ show v
-putNative _ v@(CqlMaybe _)   = fail $ "putNative: collection type: " ++ show v
-putNative _ v@(CqlTuple _)   = fail $ "putNative: tuple type: " ++ show v
+putNative V3   (CqlUdt   x) = putByteString $ runPut (mapM_ (putValue V3 . snd) x)
+putNative V2 v@(CqlUdt   _) = fail $ "putNative: udt: " ++ show v
+putNative _  v@(CqlList  _) = fail $ "putNative: collection type: " ++ show v
+putNative _  v@(CqlSet   _) = fail $ "putNative: collection type: " ++ show v
+putNative _  v@(CqlMap   _) = fail $ "putNative: collection type: " ++ show v
+putNative _  v@(CqlMaybe _) = fail $ "putNative: collection type: " ++ show v
+putNative _  v@(CqlTuple _) = fail $ "putNative: tuple type: " ++ show v
 
 -- Note: Empty lists, maps and sets are represented as null in cassandra.
 getValue :: Version -> ColumnType -> Get Value
@@ -548,17 +519,17 @@
     x <- get :: Get Int32
     y <- bytes2integer
     return (CqlDecimal (Decimal (fromIntegral x) y))
-getNative V3 (UdtColumn _ _ x) = do
+getNative V3 (UdtColumn _ x) = do
     b <- remainingBytes
     either fail return $ flip runGet b $ CqlUdt <$> do
         let (n, t) = unzip x
         zip n <$> mapM (getValue V3) t
-getNative V2 c@(UdtColumn _ _ _) = fail $ "getNative: udt: " ++ show c
-getNative _ c@(ListColumn  _)    = fail $ "getNative: collection type: " ++ show c
-getNative _ c@(SetColumn   _)    = fail $ "getNative: collection type: " ++ show c
-getNative _ c@(MapColumn _ _)    = fail $ "getNative: collection type: " ++ show c
-getNative _ c@(MaybeColumn _)    = fail $ "getNative: collection type: " ++ show c
-getNative _ c@(TupleColumn _)    = fail $ "getNative: tuple type: " ++ show c
+getNative V2 c@(UdtColumn _ _) = fail $ "getNative: udt: " ++ show c
+getNative _  c@(ListColumn  _) = fail $ "getNative: collection type: " ++ show c
+getNative _  c@(SetColumn   _) = fail $ "getNative: collection type: " ++ show c
+getNative _  c@(MapColumn _ _) = fail $ "getNative: collection type: " ++ show c
+getNative _  c@(MaybeColumn _) = fail $ "getNative: collection type: " ++ show c
+getNative _  c@(TupleColumn _) = fail $ "getNative: tuple type: " ++ show c
 
 getList :: Get [a] -> Get [a]
 getList m = do
@@ -593,6 +564,8 @@
         _ -> put (fromIntegral (B.length bytes) :: Int32)
     putByteString bytes
 
+#ifdef INCOMPATIBLE_VARINT
+
 -- 'integer2bytes' and 'bytes2integer' implementations are taken
 -- from cereal's instance declaration of 'Serialize' for 'Integer'
 -- except that no distinction between small and large integers is made.
@@ -622,6 +595,44 @@
       where
         unstep b a = a `shiftL` 8 .|. fromIntegral b
 
+#else
+
+integer2bytes :: Putter Integer
+integer2bytes n
+    | n == 0  = putWord8 0x00
+    | n == -1 = putWord8 0xFF
+    | n <  0  = do
+        let bytes = explode (-1) n
+        unless (head bytes >= 0x80) $
+            putWord8 0xFF
+        mapM_ putWord8 bytes
+    | otherwise = do
+        let bytes = explode 0 n
+        unless (head bytes < 0x80) $
+            putWord8 0x00
+        mapM_ putWord8 bytes
+
+explode :: Integer -> Integer -> [Word8]
+explode x n = loop n []
+  where
+    loop !i !acc
+        | i == x    = acc
+        | otherwise = loop (i `shiftR` 8) (fromIntegral i : acc)
+
+bytes2integer :: Get Integer
+bytes2integer = do
+    msb   <- getWord8
+    bytes <- B.unpack <$> remainingBytes
+    if msb < 0x80
+        then return (implode (msb:bytes))
+        else return (- (implode (map complement (msb:bytes)) + 1))
+
+implode :: [Word8] -> Integer
+implode = foldl' fun 0
+  where
+    fun i b = i `shiftL` 8 .|. fromIntegral b
+
+#endif
 ------------------------------------------------------------------------------
 -- Various
 
diff --git a/src/Database/CQL/Protocol/Header.hs b/src/Database/CQL/Protocol/Header.hs
--- a/src/Database/CQL/Protocol/Header.hs
+++ b/src/Database/CQL/Protocol/Header.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 module Database.CQL.Protocol.Header
     ( Header     (..)
     , HeaderType (..)
diff --git a/src/Database/CQL/Protocol/Internal.hs b/src/Database/CQL/Protocol/Internal.hs
--- a/src/Database/CQL/Protocol/Internal.hs
+++ b/src/Database/CQL/Protocol/Internal.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 -- | Like "Database.CQL.Protocol" but exports the whole
 -- encode/decode machinery for all types.
 module Database.CQL.Protocol.Internal
diff --git a/src/Database/CQL/Protocol/Record.hs b/src/Database/CQL/Protocol/Record.hs
--- a/src/Database/CQL/Protocol/Record.hs
+++ b/src/Database/CQL/Protocol/Record.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE CPP          #-}
 {-# LANGUAGE TypeFamilies #-}
 
diff --git a/src/Database/CQL/Protocol/Request.hs b/src/Database/CQL/Protocol/Request.hs
--- a/src/Database/CQL/Protocol/Request.hs
+++ b/src/Database/CQL/Protocol/Request.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE GADTs               #-}
 {-# LANGUAGE OverloadedStrings   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
diff --git a/src/Database/CQL/Protocol/Response.hs b/src/Database/CQL/Protocol/Response.hs
--- a/src/Database/CQL/Protocol/Response.hs
+++ b/src/Database/CQL/Protocol/Response.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE DeriveDataTypeable  #-}
 {-# LANGUAGE OverloadedStrings   #-}
 {-# LANGUAGE ScopedTypeVariables #-}
diff --git a/src/Database/CQL/Protocol/Tuple.hs b/src/Database/CQL/Protocol/Tuple.hs
--- a/src/Database/CQL/Protocol/Tuple.hs
+++ b/src/Database/CQL/Protocol/Tuple.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE CPP                  #-}
 {-# LANGUAGE ScopedTypeVariables  #-}
 {-# LANGUAGE TemplateHaskell      #-}
diff --git a/src/Database/CQL/Protocol/Tuple/TH.hs b/src/Database/CQL/Protocol/Tuple/TH.hs
--- a/src/Database/CQL/Protocol/Tuple/TH.hs
+++ b/src/Database/CQL/Protocol/Tuple/TH.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE CPP                 #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
@@ -189,12 +185,19 @@
 element v t = getValue v (untag t) >>= either fail return . fromCql
 
 typecheck :: [ColumnType] -> [ColumnType] -> [ColumnType]
-typecheck rr cc = if and (zipWith (===) rr cc) then [] else rr
+typecheck rr cc = if checkAll (===) rr cc then [] else rr
   where
-    (MaybeColumn a) === b               = a === b
-    (ListColumn  a) === (ListColumn  b) = a === b
-    (SetColumn   a) === (SetColumn   b) = a === b
-    (MapColumn a b) === (MapColumn c d) = a === c && b === d
-    TextColumn      === VarCharColumn   = True
-    VarCharColumn   === TextColumn      = True
-    a               === b               = a == b
+    checkAll f as bs = and (zipWith f as bs)
+
+    checkField (a, b) (c, d) = a == c && b === d
+
+    TextColumn       === VarCharColumn    = True
+    VarCharColumn    === TextColumn       = True
+    (MaybeColumn  a) === b                = a === b
+    (ListColumn   a) === (ListColumn   b) = a === b
+    (SetColumn    a) === (SetColumn    b) = a === b
+    (MapColumn  a b) === (MapColumn  c d) = a === c && b === d
+    (UdtColumn a as) === (UdtColumn b bs) = a == b && checkAll checkField as bs
+    (TupleColumn as) === (TupleColumn bs) = checkAll (===) as bs
+    a                === b                = a == b
+
diff --git a/src/Database/CQL/Protocol/Types.hs b/src/Database/CQL/Protocol/Types.hs
--- a/src/Database/CQL/Protocol/Types.hs
+++ b/src/Database/CQL/Protocol/Types.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 module Database.CQL.Protocol.Types where
 
 import Data.ByteString (ByteString)
@@ -125,7 +121,7 @@
     | SetColumn   !ColumnType
     | MapColumn   !ColumnType !ColumnType
     | TupleColumn [ColumnType]
-    | UdtColumn   !Keyspace !Text [(Text, ColumnType)]
+    | UdtColumn   !Text [(Text, ColumnType)]
     deriving (Eq)
 
 instance Show ColumnType where
@@ -159,9 +155,7 @@
                            . showString (List.intercalate ", " (map show a))
                            . showString ">"
                            $ ""
-    show (UdtColumn k n f) = showString (unpack (unKeyspace k))
-                           . showString "."
-                           . showString (unpack n)
+    show (UdtColumn t f)   = showString (unpack t)
                            . showString "<"
                            . shows (List.intercalate ", " (map show f))
                            . showString ">"
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 module Main where
 
 import Test.Tasty
diff --git a/test/Tests.hs b/test/Tests.hs
--- a/test/Tests.hs
+++ b/test/Tests.hs
@@ -1,7 +1,3 @@
--- This Source Code Form is subject to the terms of the Mozilla Public
--- License, v. 2.0. If a copy of the MPL was not distributed with this
--- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -95,7 +91,7 @@
 typeof (CqlMap  ((x,y):_)) = MapColumn (typeof x) (typeof y)
 typeof (CqlCustom _)       = CustomColumn "a"
 typeof (CqlTuple x)        = TupleColumn (map typeof x)
-typeof (CqlUdt   x)        = UdtColumn (Keyspace "") "" (map (second typeof) x)
+typeof (CqlUdt   x)        = UdtColumn "" (map (second typeof) x)
 
 instance Arbitrary Value where
     arbitrary = oneof
