diff --git a/finagle/README.md b/finagle/README.md
new file mode 100644
index 0000000000..d16afdc10d
--- /dev/null
+++ b/finagle/README.md
@@ -0,0 +1,7 @@
+## Finagle
+
+This module contains articles about Finagle and associated libraries.
+
+### Relevant articles
+
+- [Introduction to Finagle](https://www.baeldung.com/introduction-to-finagle)
diff --git a/finagle/pom.xml b/finagle/pom.xml
new file mode 100644
index 0000000000..f1dc932c13
--- /dev/null
+++ b/finagle/pom.xml
@@ -0,0 +1,30 @@
+
+
+ 4.0.0
+ Finagle
+ Finagle
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.twitter
+ finagle-core_2.13
+ 20.4.0
+
+
+ com.twitter
+ finagle-http_2.13
+ 20.4.0
+
+
+
+
+
+
diff --git a/finagle/src/main/java/com/baeldung/finagle/Client.java b/finagle/src/main/java/com/baeldung/finagle/Client.java
new file mode 100644
index 0000000000..a881f1c37c
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/Client.java
@@ -0,0 +1,24 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Http;
+import com.twitter.finagle.Service;
+import com.twitter.finagle.http.Method;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.util.Await;
+import com.twitter.util.Future;
+import scala.runtime.BoxedUnit;
+
+public class Client {
+ public static void main(String[] args) throws Exception {
+ Service service = new LogFilter().andThen(Http.newService(":8080"));
+ Request request = Request.apply(Method.Get(), "/?name=John");
+ request.host("localhost");
+ Future response = service.apply(request);
+ Await.result(response
+ .onSuccess(r -> {
+ System.out.println(r.getContentString());
+ return BoxedUnit.UNIT;
+ }));
+ }
+}
diff --git a/finagle/src/main/java/com/baeldung/finagle/GreetingService.java b/finagle/src/main/java/com/baeldung/finagle/GreetingService.java
new file mode 100644
index 0000000000..c795724192
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/GreetingService.java
@@ -0,0 +1,18 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Service;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.finagle.http.Status;
+import com.twitter.io.Buf;
+import com.twitter.io.Reader;
+import com.twitter.util.Future;
+
+public class GreetingService extends Service {
+ @Override
+ public Future apply(Request request) {
+ String greeting = "Hello " + request.getParam("name");
+ Reader reader = Reader.fromBuf(new Buf.ByteArray(greeting.getBytes(), 0, greeting.length()));
+ return Future.value(Response.apply(request.version(), Status.Ok(), reader));
+ }
+}
diff --git a/finagle/src/main/java/com/baeldung/finagle/LogFilter.java b/finagle/src/main/java/com/baeldung/finagle/LogFilter.java
new file mode 100644
index 0000000000..d381456cfe
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/LogFilter.java
@@ -0,0 +1,17 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Service;
+import com.twitter.finagle.SimpleFilter;
+import com.twitter.finagle.http.Request;
+import com.twitter.finagle.http.Response;
+import com.twitter.util.Future;
+
+public class LogFilter extends SimpleFilter {
+ @Override
+ public Future apply(Request request, Service service) {
+ System.out.println("Request host:" + request.host().getOrElse(() -> ""));
+ System.out.println("Request params:");
+ request.getParams().forEach(entry -> System.out.println("\t" + entry.getKey() + " : " + entry.getValue()));
+ return service.apply(request);
+ }
+}
diff --git a/finagle/src/main/java/com/baeldung/finagle/Server.java b/finagle/src/main/java/com/baeldung/finagle/Server.java
new file mode 100644
index 0000000000..8a9c9be192
--- /dev/null
+++ b/finagle/src/main/java/com/baeldung/finagle/Server.java
@@ -0,0 +1,15 @@
+package com.baeldung.finagle;
+
+import com.twitter.finagle.Http;
+import com.twitter.finagle.ListeningServer;
+import com.twitter.finagle.Service;
+import com.twitter.util.Await;
+import com.twitter.util.TimeoutException;
+
+public class Server {
+ public static void main(String[] args) throws TimeoutException, InterruptedException {
+ Service service = new LogFilter().andThen(new GreetingService());
+ ListeningServer server = Http.serve(":8080", service);
+ Await.ready(server);
+ }
+}
diff --git a/finagle/src/main/resources/logback.xml b/finagle/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/finagle/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/finagle/src/main/resources/twitter4j.properties b/finagle/src/main/resources/twitter4j.properties
new file mode 100644
index 0000000000..ee11dc62a1
--- /dev/null
+++ b/finagle/src/main/resources/twitter4j.properties
@@ -0,0 +1,4 @@
+oauth.consumerKey=//TODO
+oauth.consumerSecret=//TODO
+oauth.accessToken=//TODO
+oauth.accessTokenSecret=//TODO