diff --git a/accounts.go b/accounts.go
index ceb3674..76525aa 100644
--- a/accounts.go
+++ b/accounts.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"net/http"
 	"net/url"
+	"strconv"
 	"time"
 )
 
@@ -38,6 +39,15 @@ type Field struct {
 	VerifiedAt time.Time `json:"verified_at"`
 }
 
+// Source is a Mastodon account profile field
+type Source struct {
+	Privacy   string   `json:"privacy"`
+	Sensitive *bool    `json:"sensitive"`
+	Language  string   `json:"language"`
+	Note      string   `json:"note"`
+	Fields    *[]Field `json:"fields"`
+}
+
 // GetAccount return Account.
 func (c *Client) GetAccount(ctx context.Context, id ID) (*Account, error) {
 	var account Account
@@ -64,6 +74,9 @@ type Profile struct {
 	// If it is empty, update it with empty.
 	DisplayName *string
 	Note        *string
+	Locked      *bool
+	Fields      *[]Field
+	Source      *Source
 
 	// Set the base64 encoded character string of the image.
 	Avatar string
@@ -79,6 +92,26 @@ func (c *Client) AccountUpdate(ctx context.Context, profile *Profile) (*Account,
 	if profile.Note != nil {
 		params.Set("note", *profile.Note)
 	}
+	if profile.Locked != nil {
+		params.Set("locked", strconv.FormatBool(*profile.Locked))
+	}
+	if profile.Fields != nil {
+		for idx, field := range *profile.Fields {
+			params.Set(fmt.Sprintf("fields_attributes[%d][name]", idx), field.Name)
+			params.Set(fmt.Sprintf("fields_attributes[%d][value]", idx), field.Value)
+		}
+	}
+	if profile.Source != nil {
+		if len(profile.Source.Privacy) > 0 {
+			params.Set("source[privacy]", profile.Source.Privacy)
+		}
+		if profile.Source.Sensitive != nil {
+			params.Set("source[sensitive]", strconv.FormatBool(*profile.Source.Sensitive))
+		}
+		if len(profile.Source.Language) > 0 {
+			params.Set("source[language]", profile.Source.Language)
+		}
+	}
 	if profile.Avatar != "" {
 		params.Set("avatar", profile.Avatar)
 	}
diff --git a/accounts_test.go b/accounts_test.go
index 7603cc6..b59968f 100644
--- a/accounts_test.go
+++ b/accounts_test.go
@@ -6,6 +6,7 @@ import (
 	"net/http"
 	"net/http/httptest"
 	"testing"
+	"time"
 )
 
 func TestGetAccount(t *testing.T) {
@@ -93,9 +94,15 @@ func TestAccountUpdate(t *testing.T) {
 	if err == nil {
 		t.Fatalf("should be fail: %v", err)
 	}
+	tbool := true
+	fields := []Field{{"foo", "bar", time.Time{}}, {"dum", "baz", time.Time{}}}
+	source := Source{Language: "de", Privacy: "public", Sensitive: &tbool}
 	a, err := client.AccountUpdate(context.Background(), &Profile{
 		DisplayName: String("display_name"),
 		Note:        String("note"),
+		Locked:      &tbool,
+		Fields:      &fields,
+		Source:      &source,
 		Avatar:      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUoAAADrCAYAAAA...",
 		Header:      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUoAAADrCAYAAAA...",
 	})