diff --git a/README.md b/README.md
index c4b1a99..c0dec36 100644
--- a/README.md
+++ b/README.md
@@ -103,4 +103,10 @@ Also, this utility only works if the server side has a port-forwarding|virtual s
 --- 
 
 ## ● License
-MIT
\ No newline at end of file
+MIT
+
+## ● TODO
+- multiple filepaths as args, not as a flag
+- send all files in a directory
+- send all files in a directory recursively
+- ip address as an arg, not as a flag
\ No newline at end of file
diff --git a/fs/dir.go b/fs/dir.go
new file mode 100644
index 0000000..8a81b1e
--- /dev/null
+++ b/fs/dir.go
@@ -0,0 +1,93 @@
+package fs
+
+import (
+	"fmt"
+	"os"
+	"path/filepath"
+)
+
+// A struct that represents the main information about a directory
+type Directory struct {
+	Name        string
+	Path        string
+	ParentPath  string
+	Files       []*File
+	Directories []*Directory
+}
+
+var ErrorNotDirectory error = fmt.Errorf("not a directory")
+
+func GetDir(path string, recursive bool) (*Directory, error) {
+	fmt.Println("Provided path ", path)
+
+	absPath, err := filepath.Abs(path)
+	if err != nil {
+		return nil, err
+	}
+
+	fmt.Println("absolute path ", absPath)
+
+	stats, err := os.Stat(absPath)
+	if err != nil {
+		return nil, err
+	}
+
+	// check if it is a directory for real
+	if !stats.IsDir() {
+		return nil, ErrorNotDirectory
+	}
+
+	// loop through each entry in the directory
+	entries, err := os.ReadDir(absPath)
+	if err != nil {
+		return nil, err
+	}
+
+	var innerDirs []*Directory
+	var innerFiles []*File
+	for _, entry := range entries {
+		entryInfo, err := entry.Info()
+		if err != nil {
+			return nil, err
+		}
+
+		if entryInfo.IsDir() {
+			if recursive {
+				// do the recursive magic
+				innerDirPath := filepath.Join(absPath, entry.Name())
+
+				fmt.Println("inner dir path ", innerDirPath)
+
+				innerDir, err := GetDir(innerDirPath, true)
+				if err != nil {
+					return nil, err
+				}
+
+				innerDirs = append(innerDirs, innerDir)
+			}
+			// if not - skip the directory
+
+		} else {
+			innerFilePath := filepath.Join(absPath, entryInfo.Name())
+
+			fmt.Println("inner file path ", innerFilePath)
+
+			innerFile, err := GetFile(innerFilePath)
+			if err != nil {
+				return nil, err
+			}
+
+			innerFiles = append(innerFiles, innerFile)
+		}
+	}
+
+	directory := Directory{
+		Name:        stats.Name(),
+		Path:        absPath,
+		ParentPath:  filepath.Dir(absPath),
+		Directories: innerDirs,
+		Files:       innerFiles,
+	}
+
+	return &directory, nil
+}
diff --git a/fs/dir_test.go b/fs/dir_test.go
new file mode 100644
index 0000000..155ea1e
--- /dev/null
+++ b/fs/dir_test.go
@@ -0,0 +1,26 @@
+package fs
+
+import "testing"
+
+func Test_GetDir(t *testing.T) {
+	dirpath := "../testfiles/"
+
+	_, err := GetDir(dirpath, false)
+	if err != nil {
+		t.Fatalf("GetDir error: %s", err)
+	}
+}
+
+func Test_GetDirRecursive(t *testing.T) {
+	dirpath := "../testfiles/"
+
+	dir, err := GetDir(dirpath, true)
+	if err != nil {
+		t.Fatalf("GetDir error: %s", err)
+	}
+
+	expectedAmountOfUpperDirectories := 2
+	if len(dir.Directories) != expectedAmountOfUpperDirectories {
+		t.Fatalf("GetDir error: expected to have %d inner directories; got %d", expectedAmountOfUpperDirectories, len(dir.Directories))
+	}
+}
diff --git a/fs/file.go b/fs/file.go
new file mode 100644
index 0000000..1e7cd79
--- /dev/null
+++ b/fs/file.go
@@ -0,0 +1,43 @@
+package fs
+
+import (
+	"fmt"
+	"os"
+	"path/filepath"
+)
+
+// A struct that represents the main file information
+type File struct {
+	Name       string
+	Path       string
+	ParentPath string
+	Size       uint64
+}
+
+var ErrorNotFile error = fmt.Errorf("not a file")
+
+func GetFile(path string) (*File, error) {
+	absPath, err := filepath.Abs(path)
+	if err != nil {
+		return nil, err
+	}
+
+	stats, err := os.Stat(absPath)
+	if err != nil {
+		return nil, err
+	}
+
+	// check if it is a directory
+	if stats.IsDir() {
+		return nil, ErrorNotFile
+	}
+
+	file := File{
+		Name:       stats.Name(),
+		Path:       absPath,
+		ParentPath: filepath.Dir(absPath),
+		Size:       uint64(stats.Size()),
+	}
+
+	return &file, nil
+}
diff --git a/fs/file_test.go b/fs/file_test.go
new file mode 100644
index 0000000..9dbd7de
--- /dev/null
+++ b/fs/file_test.go
@@ -0,0 +1,16 @@
+package fs
+
+import "testing"
+
+func Test_GetFile(t *testing.T) {
+	filepath := "../testfiles/testfile.txt"
+
+	file, err := GetFile(filepath)
+	if err != nil {
+		t.Fatalf("GetFile error: %s", err)
+	}
+
+	if file.Name != "testfile.txt" {
+		t.Fatalf("GetFile error: filenames do not match")
+	}
+}
diff --git a/main.go b/main.go
index 1e7dc63..6a04345 100644
--- a/main.go
+++ b/main.go
@@ -13,24 +13,24 @@ import (
 
 // flags
 var (
-	PORT            *int    = flag.Int("port", 8080, "Specifies a port for a sender|port to connect to")
+	PORT            *int    = flag.Int("port", 7270, "Specifies a port to work with")
 	SENDERADDR      *string = flag.String("addr", "", "Specifies an address to connect to")
 	DOWNLOADSFOLDER *string = flag.String("downloadto", ".", "Specifies where the receiver will store downloaded file")
 	SHAREDFILE      *string = flag.String("sharefile", "", "Specifies what file sender will send")
-	LICENSE         *bool   = flag.Bool("license", false, "Prints a license text")
+	PRINTLICENSE    *bool   = flag.Bool("license", false, "Prints a license text")
 
 	SENDING bool
 
 	//go:embed LICENSE
-	LicenseText string
+	licenseText string
 )
 
 // parse flags, validate given values
 func init() {
 	flag.Parse()
 
-	if *LICENSE {
-		fmt.Println(LicenseText)
+	if *PRINTLICENSE {
+		fmt.Println(licenseText)
 		os.Exit(0)
 	}
 
diff --git a/node/node.go b/node/node.go
new file mode 100644
index 0000000..3787b91
--- /dev/null
+++ b/node/node.go
@@ -0,0 +1,7 @@
+package node
+
+
+// Server and a client in one type !
+type Node struct {
+
+}
diff --git a/node/noder.go b/node/noder.go
new file mode 100644
index 0000000..557d89f
--- /dev/null
+++ b/node/noder.go
@@ -0,0 +1,9 @@
+package node
+
+// Implementation for sender and receiver node
+type Noder interface {
+	Connect(addr string, port uint) error
+	Disconnect() error
+	Listen(dataPipe chan []byte)
+	Send(data []byte) error
+}
diff --git a/testfiles/testdir/testdir2/testfile3.txt b/testfiles/testdir/testdir2/testfile3.txt
new file mode 100644
index 0000000..70cab53
--- /dev/null
+++ b/testfiles/testdir/testdir2/testfile3.txt
@@ -0,0 +1,9 @@
+testfile3
+
+
+SAMPLE TEXT
+
+lCtrl + Lshift + u 
+15dc 2ec 15dc
+
+not on Windows tho AFAIK
diff --git a/testfiles/testdir/testfile2.txt b/testfiles/testdir/testfile2.txt
new file mode 100644
index 0000000..2d9bee5
--- /dev/null
+++ b/testfiles/testdir/testfile2.txt
@@ -0,0 +1,9 @@
+testfile2
+
+
+
+there are no buses
+in Gensokyo btw (9)
+
+
+yeah...
\ No newline at end of file
diff --git a/testfiles/testdir2/testfile4 b/testfiles/testdir2/testfile4
new file mode 100644
index 0000000..676cf1e
--- /dev/null
+++ b/testfiles/testdir2/testfile4
@@ -0,0 +1,3 @@
+testfile4
+
+*something smart and philosophic*
\ No newline at end of file
diff --git a/testfiles/testfile.txt b/testfiles/testfile.txt
new file mode 100644
index 0000000..99a7032
--- /dev/null
+++ b/testfiles/testfile.txt
@@ -0,0 +1,11 @@
+727 WYSI Airman Badeu square
+
+
+
+doable 
+
+
+FCeeeeeeeeeeeeeeeeeeeeeeeee
+
+
+testfile it is
\ No newline at end of file