diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a6f89c2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target/
\ No newline at end of file
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..8fb0510
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Manos Paterakis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..4a6b080
--- /dev/null
+++ b/README.md
@@ -0,0 +1,122 @@
+# Java-SteamGridDB
+A Java wrapper for SteamGridDB's API
+
+### Installation
+
+[](https://jitpack.io/#mpaterakis/java-steamgriddb)
+
+## Getting Started
+#### Get your API key
+[You can generate an API key on the preferences page.](https://www.steamgriddb.com/profile/preferences)
+
+#### Require the library into your project.
+```java
+import com.SteamGridDB.*;
+import com.SteamGridDB.Enums.*;
+import com.SteamGridDB.Connection.*;
+```
+
+#### Initialize the SGDBConnectionManager using your API key and the API base uri
+```java
+SGDBConnectionManager.initialize("https://www.steamgriddb.com/api/v2", "myAuthKey");
+```
+
+#### Search for a game:
+```java
+// Get an ArrayList of games that match the search term
+var games = Search.searchGamesByName("cyberpunk");
+
+// Get a JSONObject containing the response from the API [Can be converted to string using .toString()]
+var gamesJson = Search.searchGamesByNameJSON("cyberpunk");
+```
+
+#### Get a game object without searching:
+```java
+// Get a Game using a GameId
+var game = Game.getGameByGameId(1234);
+
+// Get a Game using a SteamAppId
+var game = Game.getGameBySteamAppId(567890);
+
+// Get a Game using its constructor
+var game = new Game(567890, SGDBIdTypes.SteamAppId);
+```
+
+#### Do something with a game object:
+```java
+// Get a Game's Name
+var gameName = game.getName();
+
+// Get a Game's styles
+var stylesArray = game.getStyles();
+```
+
+#### Get some grids:
+```java
+// Get grids by game ID
+var grid = Grid.getGridsByGameId(1234);
+
+// Get grids by Steam App Id
+var grids = Grid.getGridsBySteamAppId(1234);
+
+// Alternatively, you can do it like this:
+var grids = Grid.getGridsById(1234, SGDBIdTypes.GameId);
+```
+
+#### Filter the styles:
+```java
+// Create an SGDBStyles array
+SGDBStyles styles[] = {SGDBStyles.Alternate, SGDBStyles.NoLogo};
+
+// Same as before, but using the styles filter
+var grid = Grid.getGridsByGameId(1234, styles);
+
+var grids = Grid.getGridsBySteamAppId(1234, styles);
+
+var grids = Grid.getGridsById(1234, SGDBIdTypes.GameId, styles);
+```
+
+#### Do something with a grid object:
+```java
+// Get the first Grid's score
+var gridScore = grids.get(0).getScore();
+
+// Get the same Grid's Author's username
+var authorName = grids.get(0).getAuthor().getName();
+```
+
+## Other methods
+#### Vote on grids:
+```java
+// Upvote the first grid of the game with ID 1234
+var grid = Grid.getGridsByGameId(1234).get(0);
+grid.upvote();
+
+// Downvote the same grid
+var grid = Grid.getGridsByGameId(1234).get(0);
+grid.upvote();
+
+// Alternatively, use the Grid's ID (80 in this case) to vote:
+Grid.upvoteById(80);
+Grid.downvoteById(80);
+```
+
+#### Upload a grid:
+```java
+// Upload a blurred grid to Half-Life 2 (2254)
+Grid.upload(2254, SGDBStyles.Blurred, "path/of/image.img");
+```
+
+#### Delete grids:
+```java
+// Delete a grid by ID
+Grid.deleteByGridID(gameID);
+
+// Delete multiple grids by ID
+var gameIDs = {123, 456};
+Grid.deleteByGridIDs(gameIDs);
+
+// Delete a Grid object
+var grid = Grid.getGridsByGameId(1234).get(0);
+grid.delete();
+```
diff --git a/nbactions.xml b/nbactions.xml
new file mode 100644
index 0000000..6d9031e
--- /dev/null
+++ b/nbactions.xml
@@ -0,0 +1,46 @@
+
+
+
+ run
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:1.5.0:exec
+
+
+ -classpath %classpath ${packageClassName}
+ java
+
+
+
+ debug
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:1.5.0:exec
+
+
+ -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address} -classpath %classpath ${packageClassName}
+ java
+ true
+
+
+
+ profile
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:1.5.0:exec
+
+
+ -classpath %classpath ${packageClassName}
+ java
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..4e754d5
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,26 @@
+
+
+ 4.0.0
+ com.steamgriddb
+ java-steamgriddb
+ 1.0
+ jar
+
+
+ org.json
+ json
+ 20180813
+
+
+
+ UTF-8
+ 11
+ 11
+
+
+
+ jitpack.io
+ https://jitpack.io
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/steamgriddb/Author.java b/src/main/java/com/steamgriddb/Author.java
new file mode 100644
index 0000000..ccdc289
--- /dev/null
+++ b/src/main/java/com/steamgriddb/Author.java
@@ -0,0 +1,58 @@
+package com.steamgriddb;
+
+/**
+ * Represents a Author as found on SteamGridDB.com
+ *
+ * @author mpaterakis
+ */
+public class Author {
+
+ /*
+ * Fields
+ */
+ private String name = "";
+ private String steam64 = "";
+ private String avatar = "";
+
+ /**
+ * Constructor for Author.
+ *
+ * @param name The Author's name
+ * @param steam64 The Author's Steam64 ID
+ * @param avatar The Author's avatar URL
+ */
+ public Author(String name, String steam64, String avatar) {
+ this.name = name;
+ this.steam64 = steam64;
+ this.avatar = avatar;
+ }
+
+ /**
+ * Get the Author's name.
+ *
+ * @return The Author's name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Get the Author's Steam64 ID.
+ *
+ * @return The Author's Steam64 ID
+ */
+ public String getSteam64() {
+ return steam64;
+ }
+
+ /**
+ * Get the Author's avatar URL.
+ *
+ * @return The Author's avatar URL
+ */
+ public String getAvatar() {
+ return avatar;
+ }
+
+
+}
diff --git a/src/main/java/com/steamgriddb/Connection/SGDBConnectionManager.java b/src/main/java/com/steamgriddb/Connection/SGDBConnectionManager.java
new file mode 100644
index 0000000..49855c9
--- /dev/null
+++ b/src/main/java/com/steamgriddb/Connection/SGDBConnectionManager.java
@@ -0,0 +1,263 @@
+package com.steamgriddb.Connection;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpResponse;
+import java.net.http.HttpRequest;
+import java.net.http.HttpRequest.BodyPublisher;
+import java.net.http.HttpRequest.BodyPublishers;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Random;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.json.JSONObject;
+
+/**
+ * This class handles the connection to SGDB.
+ *
+ * @author mpaterakis
+ */
+public class SGDBConnectionManager {
+
+ /*
+ * Fields
+ */
+ private static String APIUri = "https://www.steamgriddb.com/API/v2/";
+ private static String authKey = "";
+
+ /**
+ * Get a JSONObject from an API path.
+ *
+ * @param APICallPath The API path
+ * @return JSONObject containing the response (Or error code if the call fails)
+ */
+ public static JSONObject getJSON(String APICallPath) {
+ int statusCode = 0;
+
+ try {
+ HttpClient client = HttpClient.newBuilder().build();
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(APIUri + APICallPath))
+ .GET()
+ .setHeader("Authorization", "Bearer " + authKey)
+ .build();
+
+ HttpResponse> response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ statusCode = response.statusCode();
+
+ System.out.println(response.toString());
+
+ JSONObject json = new JSONObject(response.body().toString());
+
+ if (statusCode != 200) {
+ System.out.println("API Error! Status code: " + statusCode);
+ }
+
+ return json;
+ } catch (IOException | InterruptedException ex) {
+ Logger.getLogger(SGDBConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ return new JSONObject("{ \"success\": \"false\", \"status\": " + statusCode + "}");
+ }
+
+
+ /**
+ * Make a POST request.
+ *
+ * @param APICallPath The API path for the request
+ * @return A JSONOBject containing the response of the request
+ */
+ public static JSONObject post(String APICallPath) {
+ int statusCode = 0;
+
+ try {
+ HttpClient client = HttpClient.newBuilder().build();
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(URI.create(APIUri + APICallPath))
+ .POST(BodyPublishers.ofString(""))
+ .setHeader("Authorization", "Bearer " + authKey)
+ .build();
+
+ HttpResponse> response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ statusCode = response.statusCode();
+
+ JSONObject json = new JSONObject(response.body().toString());
+
+ if (statusCode != 200) {
+ System.out.println("API Error! Status code: " + statusCode);
+ }
+
+ return json;
+ } catch (IOException | InterruptedException ex) {
+ Logger.getLogger(SGDBConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ return new JSONObject("{ \"success\": \"false\", \"status\": " + statusCode + "}");
+ }
+
+
+ /**
+ * Make a multipart POST request.
+ *
+ * @param APICallPath The API path for the request
+ * @param params The parameters for the Multipart post
+ * @return A JSONObject containing the response of the request
+ */
+ public static JSONObject postMultipart(String APICallPath, Map